Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| tutoriel:script_shell [Le 13/12/2012, 11:00] – 193.253.208.41 | tutoriel:script_shell [Le 28/07/2026, 10:51] (Version actuelle) – [Liens] ajout lien vers blog S.Robert ! bcag2 | ||
|---|---|---|---|
| Ligne 5: | Ligne 5: | ||
| ====== Introduction aux scripts shell ====== | ====== Introduction aux scripts shell ====== | ||
| - | Un script shell permet d' | + | Un script shell permet d' |
| - | + | ||
| - | ===== Écrire un script ===== | + | |
| - | + | ||
| - | Si vous voulez écrire un programme sh, vous avez deux possibilités : | + | |
| - | * soit vous tapez dans un shell toutes les commandes | + | |
| - | * ou alors vous rassemblez toutes les instructions copiées par ci par là dans un fichier sh. | + | |
| - | + | ||
| - | À titre d' | + | |
| <code bash> | <code bash> | ||
| #!/bin/bash | #!/bin/bash | ||
| - | # indique au système que l' | + | # This script |
| - | # En cas général les "#" | + | # Accepts two parameters: input file and output file |
| - | echo Mon premier | + | # Usage: ./< |
| - | echo Liste des fichiers | + | |
| - | ls -la | + | |
| - | exit 0 | + | # Make a copy of the file |
| - | </ | + | cp " |
| - | Le résultat de ce script est d' | + | # Get the number of frames |
| - | en dessous « Liste des fichiers : | + | numframes=$(gifsicle --info " |
| - | commande | + | | grep --perl-regexp --only-matching |
| + | | grep --perl-regexp --only-matching | ||
| - | Comme vous l'avez compris, la commande '' | + | # Deletion |
| - | quelque chose à l' | + | let i=0 |
| + | while test $i -lt $numframes | ||
| + | do | ||
| + | rem=$(( $i % 2 )) | ||
| - | <note warning> | + | if test $rem -eq 0 |
| + | then | ||
| + | gifsicle " | ||
| + | fi | ||
| - | ===== Exécuter un script ===== | + | let i=i+1 |
| - | + | done | |
| - | « Mais comment on exécute ce script ? » | + | </ |
| + | =====Pour faire qu'un script soit exécutable ===== | ||
| ==== Méthode graphique ==== | ==== Méthode graphique ==== | ||
| - | Votre script est un simple fichier texte, par défaut il s' | + | Votre script est un simple fichier texte, par défaut il s' |
| - | Pour qu'il soit autorisé à se lancer en temps que programme, il faut modifier ses propriétés.\\ | + | Pour qu'il soit autorisé à se lancer en tant que programme, il faut modifier ses propriétés. |
| - | Pour cela faites un clic droit sur son icône, et dans l' | + | Pour cela faites un clic droit sur son icône, et dans l' |
| Par la suite, un double-clic sur l’icône vous laissera le choix entre afficher le fichier (dans un éditeur de texte) et le lancer (directement ou dans un terminal pour voir d' | Par la suite, un double-clic sur l’icône vous laissera le choix entre afficher le fichier (dans un éditeur de texte) et le lancer (directement ou dans un terminal pour voir d' | ||
| + | |||
| + | Par ailleurs [[: | ||
| + | |||
| + | === Problème connu === | ||
| + | |||
| + | Sous [[: | ||
| + | - Dans le menu principal, allez sur //Outils système// et faites un //clic droit -> Propriétés// | ||
| + | - Ouvrez votre gestionnaire de fichier [[: | ||
| + | - Remplacez le contenu du champ //Terminal emulator// par le contenu du champ // | ||
| + | - Vous pouvez ensuite suivre la méthode graphique indiquée ci-dessus pour exécuter vos scripts shell. | ||
| ==== Méthode dans un terminal ==== | ==== Méthode dans un terminal ==== | ||
| + | Pour utiliser un script, on peut le lancer avec la commande servant à l' | ||
| + | <code bash> | ||
| - | Il suffit de se placer dans le dossier où est le script, | + | La commande |
| + | <code bash> | ||
| - | | + | Grâce au [[# |
| + | Il faut avant tout le rendre exécutable avec '' | ||
| + | Pour ceci entrer la commande : | ||
| + | < | ||
| - | Si vous voulez l'exécuter | + | Puis exécuter le script |
| + | <code bash>./ | ||
| - | chmod +x nom_du_script | + | === Le chemin ./ === |
| - | Puis vous pouvez exécuter le script | + | Ce '' |
| - | ./ | + | === $PATH === |
| - | ==== Modifier le PATH ==== | + | La [[: |
| - | Il peut être intéressant d'ajouter | + | En plaçant un fichier exécutable (comme un script) dans l' |
| - | Je m'explique, quand vous tapez une commande (" | + | Ubuntu dispose d'un répertoire des [[: |
| - | Pour voir à quoi ressemble | + | Pour voir à quoi ressemble |
| echo $PATH | echo $PATH | ||
| - | Cette commande | + | Cette commande |
| / | / | ||
| - | C'est à dire que le shell va aller voir si la définition de la commande tapée (" | + | C'est à dire que le système |
| - | Ajouter | + | On peut aussi ajouter |
| - | Pour pouvoir utiliser mes scripts en tapant directement leur nom (sans le " | + | Pour ceci, il suffit |
| - | Pour ceci, il suffit | + | |
| export PATH=$PATH: | export PATH=$PATH: | ||
| + | où '' | ||
| La commande | La commande | ||
| Ligne 85: | Ligne 99: | ||
| / | / | ||
| - | et je peux lancer le script appelé | + | et on peut lancer le script appelé |
| - | monScript | + | monScript.sh |
| - | <note tip> | + | <note tip> |
| + | Cette modification du '' | ||
| + | Pour rendre la modification permanente, ajouter | ||
| + | </ | ||
| - | ===== Les différents types de shells ===== | + | <note important> |
| + | En l' | ||
| + | </ | ||
| - | Comme vous avez sûrement dû l' | + | === Les différents types de shells |
| - | * dash : shell par défaut utilisé pour exécuter les scripts sur Ubuntu ; | + | Il existe |
| - | * bash (//Bourne Again SHell//) : conçu par le projet GNU, shell linux ; le shell par défaut sur Ubuntu ; | + | |
| - | * rbash : un shell restreint basé sur bash. Il existe de nombreuses variantes de bash ; | + | |
| - | * csh, tcsh : shells C, créés par Bill Joy de Berkeley ; | + | |
| - | * zsh, shell C écrit par Paul Falstad ; | + | |
| - | * ksh (<=> ksh88 sur Solaris et equivaut a ksh93 sur les autres UNIX/Linux cf.[[http://en.wikipedia.org/wiki/ | + | |
| - | * rc : shell C, lui aussi conçu par le projet GNU ; | + | |
| - | * tclsh : shell utilisant Tcl ; | + | |
| - | * wish : shell utilisant Tk ; | + | |
| - | Il existe | + | * '' |
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| - | La commande | + | Il existe encore beaucoup d' |
| + | |||
| + | La commande | ||
| + | |||
| + | < | ||
| + | On peut aussi écrire des scripts dans d' | ||
| + | | ||
| + | | ||
| + | * '' | ||
| + | * '' | ||
| + | * etc. | ||
| + | </ | ||
| + | |||
| + | === Shebang === | ||
| + | |||
| + | Le [[wpfr> | ||
| + | |||
| + | Pour '' | ||
| + | < | ||
| ===== Les variables ===== | ===== Les variables ===== | ||
| + | Il faut savoir qu'en bash les variables sont toutes des chaînes de caractères.\\ | ||
| + | Cela dépendra de son USAGE, pour une opération arithmétique prochaine voir : let ma_variable sinon pour conserver une valeur : | ||
| + | il suffit de lui donner un nom et une valeur avec l' | ||
| + | <code bash> | ||
| + | ma_variable=unmot | ||
| + | </ | ||
| + | Ici la valeur est affectée à la variable ma_variable .\\ | ||
| + | Attention: pas d' | ||
| + | Autre exemple avec une commande avec arguments : | ||
| + | <code bash> | ||
| + | // | ||
| - | Pour appeller | + | Pour voir le contenu d'une variable, |
| - | <code bash> | + | <code bash> |
| + | renverra : unmot . | ||
| - | Ce petit code va afficher | + | Pour gérer les espaces et autres caractères spéciaux du shell, on utilisera les guillemets ou bien une notation avec des apostrophes : |
| + | <code bash> | ||
| + | <code bash> | ||
| + | <code bash> | ||
| + | <code bash> | ||
| + | renverront toutes | ||
| - | Pour affecter une valeur à une variable c'est très simple. | + | Et avec des chemins de répertoires : |
| <code bash> | <code bash> | ||
| - | MSG=salut | + | chemin_de_base="/ |
| - | echo $MSG | + | chemin_complet=" |
| </ | </ | ||
| + | <note important> | ||
| + | Des variables système permettent d' | ||
| + | Pour voir les variables d' | ||
| + | <code bash> | ||
| + | |||
| + | Quelques variables d' | ||
| + | HOME, USER, PATH, IFS,... | ||
| + | |||
| + | Pour appeler ou voir une variable, par exemple HOME, il suffit de mettre un $ devant, par exemple : | ||
| + | <code bash> | ||
| + | |||
| + | Ce petit code va afficher la variable HOME à l' | ||
| - | Il existe des variables un peu spéciales | + | Il existe des variables un peu spéciales |
| ^Nom^fonction^ | ^Nom^fonction^ | ||
| |$*| contient tous les arguments passés à la fonction| | |$*| contient tous les arguments passés à la fonction| | ||
| - | |$#| contient le nombre d'argument| | + | |$#| contient le nombre d'arguments| |
| |$?| contient le code de retour de la dernière opération| | |$?| contient le code de retour de la dernière opération| | ||
| |$0| contient le nom du script| | |$0| contient le nom du script| | ||
| Ligne 130: | Ligne 196: | ||
| |$!| contient le PID de la dernière commande lancée| | |$!| contient le PID de la dernière commande lancée| | ||
| - | Exemple : créer le fichier arg.sh avec le contenu qui suit | + | Exemple : créer le fichier arg.sh avec le contenu qui suit : |
| <code bash> | <code bash> | ||
| #!/bin/bash | #!/bin/bash | ||
| - | echo " | + | echo " |
| - | echo "Les arguments sont "$* | + | echo "Les arguments sont ... : |
| - | echo "Le second argument est "$2 | + | echo "Le second argument est : |
| - | echo "Et le code de retour du dernier echo est "$? | + | echo "Et le code de retour du dernier echo est : |
| </ | </ | ||
| - | Lancez ce script avec un ou plusieurs arguments et vous aurez | + | Lancez ce script avec un ou plusieurs arguments et vous aurez : |
| <code bash> | <code bash> | ||
| ./arg.sh 1 2 3 | ./arg.sh 1 2 3 | ||
| - | Nombre d'argument | + | Nombre d'arguments ... : |
| - | Les arguments sont 1 2 3 | + | Les arguments sont ... : |
| - | Le second argument est 2 | + | Le second argument est : |
| - | Et le code de retour du dernier echo est 0 | + | Et le code de retour du dernier echo est : |
| </ | </ | ||
| - | Exemple: | + | Exemple: |
| - | ===== Les tableaux ===== | + | |
| Pour déclarer un tableau, plusieurs méthodes : | Pour déclarer un tableau, plusieurs méthodes : | ||
| - | + | première | |
| - | Premiere | + | |
| <code bash> | <code bash> | ||
| - | ou bien | + | ou bien : |
| <code bash> | <code bash> | ||
| - | tab[0]=John Smith | + | tab[0]='John Smith' |
| - | tab[1]=Jane Doe | + | tab[1]='Jane Doe' |
| </ | </ | ||
| Pour compter le nombre d' | Pour compter le nombre d' | ||
| <code bash> | <code bash> | ||
| - | len=${# | + | len=${# |
| </ | </ | ||
| Ligne 175: | Ligne 237: | ||
| Pour afficher tous les éléments : | Pour afficher tous les éléments : | ||
| <code bash> | <code bash> | ||
| - | ou bien (en bash ou en ksh93 mais pas en ksh88): | + | ou bien (en bash ou en ksh93 mais pas en ksh88) : |
| <code bash>for i in ${!tab[@]}; do echo ${tab[i]}; done</ | <code bash>for i in ${!tab[@]}; do echo ${tab[i]}; done</ | ||
| - | ou encore ( C style ) | + | ou encore ( C style ) : |
| <code bash>for (( i=0; i < ${#tab[@]}; i++ )); do echo ${tab[i]}; done</ | <code bash>for (( i=0; i < ${#tab[@]}; i++ )); do echo ${tab[i]}; done</ | ||
| - | ===== Les arguments en ligne de commande | + | |
| + | NB : toutes les variables sont des tableaux. Par défaut, c'est le premier élément qui est appelé : | ||
| + | <code bash> | ||
| + | et : | ||
| + | <code bash> | ||
| + | renverront la même réponse. | ||
| + | |||
| + | NB2 : les tableaux sont séparés par un séparateur défini : l' | ||
| + | Par défaut l'IFS est composé des trois caractères : $' \t\n' soit espace, tabulation, saut de ligne. | ||
| + | Il peut être forcé sur un autre caractère. | ||
| + | <code bash>IFS=$SEPARATEUR</ | ||
| + | $SEPARATEUR pourra être : | ||
| + | * une lettre (pe : n, i,...) | ||
| + | * une ponctuation (pe : ',', | ||
| + | * un caractère spécial : ($' | ||
| + | |||
| + | ==== Les arguments en ligne de commande ==== | ||
| Pour passer des arguments en ligne de commande c'est encore une fois très simple. Chaque argument est numéroté et ensuite on l' | Pour passer des arguments en ligne de commande c'est encore une fois très simple. Chaque argument est numéroté et ensuite on l' | ||
| Ligne 189: | Ligne 267: | ||
| <code bash> | <code bash> | ||
| #!/bin/sh | #!/bin/sh | ||
| - | echo $2 echo $1 | + | echo $3 |
| + | echo $2 | ||
| </ | </ | ||
| Notez que $0 est le nom du fichier. | Notez que $0 est le nom du fichier. | ||
| + | '' | ||
| - | ===== Les structures | + | Voici un exemple de script où vous devez vous souvenir de ce que vous avez écrit (un petit jeu de mémoire, quoi) : |
| + | < | ||
| + | #!/bin/sh | ||
| + | clear # Un peu facile si la commande reste au dessus :-) | ||
| + | until [ $# = 0 ] | ||
| + | do | ||
| + | echo -n "Taper l' | ||
| + | read Reslt | ||
| + | if [ " | ||
| + | echo "Bien joué !" | ||
| + | else | ||
| + | echo "Non mais quand même !!! C' | ||
| + | sleep 3 # Juste pour le fun du script qui rage ;-p | ||
| + | echo "Donc je te bannis de ubuntu-fr.org ! Et toc !! Tu ne peux rien contre moi !!!" | ||
| + | exit 1 | ||
| + | fi | ||
| + | shift # On défile | ||
| + | done | ||
| + | echo "Vous avez réussi !" | ||
| + | </ | ||
| + | |||
| + | ==== L' | ||
| + | <code bash>(( variable = 2 + $autre_var * 5 ))</ | ||
| + | Exemple: besoin | ||
| + | <code bash> | ||
| + | id_per_step=500 | ||
| + | for (( i=0; i<8; i++ )); do | ||
| + | (( min_step_id = 1 + $i * $id_per_step )) | ||
| + | (( max_step_id = (( $i + 1 )) * $id_per_step )) | ||
| + | echo " | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | ===== Vocabulaire | ||
| ==== La commande test ==== | ==== La commande test ==== | ||
| - | La commande test existe sous tous les unix, elle permet de faire un test et de renvoyer 0 si tout s'est bien passé ou 1 en cas d' | ||
| - | En mode console, faites [[http:// | + | La commande test existe sous tous les Unix, elle permet de faire un test et de renvoyer 0 si tout s'est bien passé ou 1 en cas d' |
| + | |||
| + | En mode console, faites [[http:// | ||
| - | === Opérateurs de test === | + | === Opérateurs de test sur fichiers |
| ^ Syntaxe ^ Fonction réalisée ^ | ^ Syntaxe ^ Fonction réalisée ^ | ||
| - | | -e fichier | + | | -e fichier |
| - | | -d fichier | + | | -d répertoire |
| - | | -f fichier | + | | -f fichier |
| - | | -w fichier | + | | -w fichier |
| - | | -x fichier | + | | -x fichier |
| - | | f1 -nt f2 | + | | f1 -nt f2 |
| - | | f1 -ot f2 | + | | f1 -ot f2 |
| + | <note tip>Si vous préférez vérifier que votre // | ||
| - | === Opérateurs de comparaison | + | === Opérateurs de comparaison |
| ^ Syntaxe ^ Fonction réalisée ^ | ^ Syntaxe ^ Fonction réalisée ^ | ||
| - | | $A -lt 5 | renvoie | + | | $A -lt 5 | renvoie 0 si $A est strictement inférieur à 5 | |
| | $A -le 5 | renvoie 0 si $A est inférieur ou égal à 5 | | | $A -le 5 | renvoie 0 si $A est inférieur ou égal à 5 | | ||
| - | | $A -gt 5 | renvoie | + | | $A -gt 5 | renvoie 0 si $A est strictement supérieur à 5 | |
| | $A -ge 5 | renvoie 0 si $A est supérieur ou égal à 5 | | | $A -ge 5 | renvoie 0 si $A est supérieur ou égal à 5 | | ||
| - | | $A -eq 5 | renvoie | + | | $A -eq 5 | renvoie 0 si $A est égal à 5 | |
| | $A -ne 5 | renvoie 0 si $A est différent de 5 | | | $A -ne 5 | renvoie 0 si $A est différent de 5 | | ||
| === Les crochets === | === Les crochets === | ||
| + | |||
| On peut raccourcir la commande test par des crochets. Exemple : | On peut raccourcir la commande test par des crochets. Exemple : | ||
| Ligne 233: | Ligne 349: | ||
| 0 | 0 | ||
| </ | </ | ||
| - | Affichera la valeur 0 : ce fichier existe, 1 dans le cas où le fichier /etc/passwd n' | + | Affichera la valeur 0 : ce fichier existe, 1 dans le cas où le fichier /etc/passwd n' |
| La syntaxe la plus appropriée dans de la programmation shell moderne est le double crochet : | La syntaxe la plus appropriée dans de la programmation shell moderne est le double crochet : | ||
| <code bash>[[ -f /etc/passwd ]]</ | <code bash>[[ -f /etc/passwd ]]</ | ||
| - | Cela gère bien mieux les problèmes d'espace | + | Cela gère bien mieux les problèmes d'espaces |
| === Les opérateurs logiques === | === Les opérateurs logiques === | ||
| + | |||
| Il y a en 3 : | Il y a en 3 : | ||
| - | * le **et** logique | + | ^ opérateur ^ solution POSIX ^ solution BASH moderne ^ |
| - | | + | | **et** logique |
| - | | + | | **ou** logique |
| - | Exemple : | + | | **non** logique |
| - | <code bash> | + | |
| - | echo " | + | |
| - | test expr 1 -a expr2 | + | |
| - | [ expr1 -a expr2 ] | + | |
| - | </ | + | |
| - | == Table de vérité de « -o » == | + | |
| - | + | ||
| - | ^ Comparaison ^ Résultat ^ Calcul ^ | + | |
| - | | 0 ou 0 | 0 | 0 + 0 = 0 | | + | |
| - | | 0 ou 1 | 1 | 0 + 1 = 1 | | + | |
| - | | 1 ou 0 | 1 | 1 + 0 = 1 | | + | |
| - | | 1 ou 1 | 1 | 1 + 1 = 1 | | + | |
| - | + | ||
| - | Dès que l'une des deux assertions est vérifiée, la condition globale l'est aussi. | + | |
| == Table de vérité de « -a » == | == Table de vérité de « -a » == | ||
| Ligne 269: | Ligne 372: | ||
| Les deux assertions doivent être vérifiées pour que la condition le soit aussi. | Les deux assertions doivent être vérifiées pour que la condition le soit aussi. | ||
| + | |||
| + | == Table de vérité de « -o » == | ||
| + | |||
| + | ^ Comparaison ^ Résultat ^ Calcul ^ | ||
| + | | 0 ou 0 | 0 | 0 + 0 = 0 | | ||
| + | | 0 ou 1 | 1 | 0 + 1 = 1 | | ||
| + | | 1 ou 0 | 1 | 1 + 0 = 1 | | ||
| + | | 1 ou 1 | 1 | 1 + 1 = 1 | | ||
| + | |||
| + | Dès que l'une des deux assertions est vérifiée, la condition globale l'est aussi. | ||
| Exemple plus complet : | Exemple plus complet : | ||
| Ligne 281: | Ligne 394: | ||
| echo "Le fichier n' | echo "Le fichier n' | ||
| fi | fi | ||
| - | exit 0 | ||
| </ | </ | ||
| La seule chose qui prête à confusion est que l'on vérifie seulement si le fichier « file » est dans le répertoire où le script a été exécuté. | La seule chose qui prête à confusion est que l'on vérifie seulement si le fichier « file » est dans le répertoire où le script a été exécuté. | ||
| - | |||
| ==== La structure : `if` ==== | ==== La structure : `if` ==== | ||
| Ligne 294: | Ligne 405: | ||
| En bash, les variables ne se déclarent généralement pas avant leur utilisation, | En bash, les variables ne se déclarent généralement pas avant leur utilisation, | ||
| - | Pour pouvoir voir la valeur d'une variable il faut faire précéder son nom du caractère | + | Pour pouvoir voir la valeur d'une variable il faut faire précéder son nom du caractère |
| - | + | ||
| <code bash> | <code bash> | ||
| Ligne 311: | Ligne 420: | ||
| fi | fi | ||
| </ | </ | ||
| + | <note tip> | ||
| + | Les crochets simples [] correspondent à des tests de condition conformes au shell POSIX.\\ | ||
| + | Les doubles permettent d' | ||
| + | Préférez les crochets simples pour une meilleure compatibilité. | ||
| + | </ | ||
| === Explication === | === Explication === | ||
| Ligne 323: | Ligne 436: | ||
| L' | L' | ||
| - | < | + | < |
| - | Ensuite vient l' | + | Ensuite vient l' |
| pour délimiter la condition. La condition doit bien être séparée des crochets par un espace ! Attention, la variable est mise entre guillemets | pour délimiter la condition. La condition doit bien être séparée des crochets par un espace ! Attention, la variable est mise entre guillemets | ||
| car dans le cas où la variable est vide, le shell ne retourne pas d' | car dans le cas où la variable est vide, le shell ne retourne pas d' | ||
| Ligne 331: | Ligne 444: | ||
| [: =: unaryoperator expected | [: =: unaryoperator expected | ||
| - | L' | + | L' |
| - | Exemple | + | Exemple |
| - | si le répertoire toto n' existe pas , le créer | + | créer |
| <code bash> | <code bash> | ||
| [ ! -d /tmp/toto ] && mkdir /tmp/toto | [ ! -d /tmp/toto ] && mkdir /tmp/toto | ||
| Ligne 344: | Ligne 457: | ||
| Les « { » servent à bien délimiter le bloc d' | Les « { » servent à bien délimiter le bloc d' | ||
| - | Ensuite, '' | + | Ensuite, '' |
| - | Enfin, '' | + | Enfin, '' |
| - | '' | + | '' |
| - | Quelques petites commandes | + | Quelques petites commandes |
| sh -n nom_du_fichier | sh -n nom_du_fichier | ||
| Ligne 362: | Ligne 475: | ||
| Celle-ci sert à montrer les variables qui n'ont pas été utilisées pendant l' | Celle-ci sert à montrer les variables qui n'ont pas été utilisées pendant l' | ||
| - | FIXME Voici le tableau des opérateurs de comparaison, | + | Voici le tableau des opérateurs de comparaison, |
| + | <code bash> | ||
| + | $A = $B # Vérifie si les deux chaînes sont égales. | ||
| + | |||
| + | $A != $B # Vérifie si les deux chaînes sont différentes. | ||
| + | -z $A # Vérifie si A n' | ||
| + | -n $A # Vérifie si A existe (contient une chaîne). | ||
| + | </ | ||
| - | ==== La structure `while` ==== | + | ==== Les structures |
| - | La commande '' | + | La commande '' |
| est respectée : | est respectée : | ||
| Ligne 387: | Ligne 507: | ||
| done | done | ||
| echo "Non mais, le brute-force est interdit en France !!" | echo "Non mais, le brute-force est interdit en France !!" | ||
| - | exit 0 | ||
| </ | </ | ||
| Ligne 400: | Ligne 519: | ||
| 'cmpt = cmpt+1' | 'cmpt = cmpt+1' | ||
| - | `while` permet de faire exécuter la portion de code un nombre | + | `while` permet de faire exécuter la portion de code un nombre |
| La commande `until` fait la même chose que la commande `while` mais en inversant. | La commande `until` fait la même chose que la commande `while` mais en inversant. | ||
| C' | C' | ||
| s' | s' | ||
| + | Par exemple, si on a besoin d' | ||
| + | <code bash> | ||
| + | #!/bin/sh | ||
| + | until pidof wmaker | ||
| + | do | ||
| + | sleep 1 | ||
| + | done | ||
| + | xmessage " | ||
| + | [ $? -eq 0 ] && xmessage "Load more..." | ||
| + | </ | ||
| + | Mais on aurait pu aussi faire: | ||
| + | <code bash> | ||
| + | #!/bin/sh | ||
| + | while [ -z $(pidof wmaker) ] | ||
| + | do | ||
| + | sleep 1 | ||
| + | done | ||
| + | #(...) | ||
| + | </ | ||
| - | + | ==== La structure case ==== | |
| - | ====La structure | + | |
| Regardons la syntaxe de cette commande, qui n'est pas une des plus simples : | Regardons la syntaxe de cette commande, qui n'est pas une des plus simples : | ||
| Ligne 428: | Ligne 565: | ||
| #!/bin/sh | #!/bin/sh | ||
| | | ||
| - | echo -n "Etes-vous fatigué ? " | + | echo -n "Êtes-vous fatigué ? " |
| read on | read on | ||
| | | ||
| Ligne 436: | Ligne 573: | ||
| * ) echo "Ah bon ?";; | * ) echo "Ah bon ?";; | ||
| esac | esac | ||
| - | exit 0 | ||
| </ | </ | ||
| La seule chose qui mérite vraiment d' | La seule chose qui mérite vraiment d' | ||
| Cela indique tout simplement l' | Cela indique tout simplement l' | ||
| - | |||
| Il existe aussi plusieurs structures pour les modèles, telles que : | Il existe aussi plusieurs structures pour les modèles, telles que : | ||
| Ligne 452: | Ligne 587: | ||
| Et plein d' | Et plein d' | ||
| - | ==On mélange tout ça== | + | === On mélange tout ça === |
| Pour vous donner une idée précise de ce que peuvent réaliser toutes ces instructions, | Pour vous donner une idée précise de ce que peuvent réaliser toutes ces instructions, | ||
| Ligne 479: | Ligne 614: | ||
| case $reps in | case $reps in | ||
| help | hlp ) | help | hlp ) | ||
| - | echo "A propos de TS --> about" | + | echo "À propos de TS --> about" |
| echo "ls --> liste les fichiers" | echo "ls --> liste les fichiers" | ||
| echo "rm --> détruit un fichier (guidé)" | echo "rm --> détruit un fichier (guidé)" | ||
| Ligne 508: | Ligne 643: | ||
| esac | esac | ||
| done | done | ||
| - | exit 0 | ||
| </ | </ | ||
| - | ==Remarque== | + | === Remarque |
| Comme vous l'avez remarqué, l' | Comme vous l'avez remarqué, l' | ||
| Ligne 518: | Ligne 652: | ||
| écrivez. | écrivez. | ||
| - | ====La structure for==== | + | ==== La structure for ==== |
| - | L' | + | |
| + | L' | ||
| <code bash> | <code bash> | ||
| for variable in valeurs; do | for variable in valeurs; do | ||
| Ligne 526: | Ligne 661: | ||
| </ | </ | ||
| - | Comme vous l' | + | ou le classique: |
| + | <code bash> | ||
| + | for (( i=$min; i<=$max; i++ )); do | ||
| + | instructions_avec_i # ou pas | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | Comme vous l' | ||
| + | Rien ne vaut un exemple : | ||
| <code bash> | <code bash> | ||
| #!/bin/sh | #!/bin/sh | ||
| Ligne 532: | Ligne 675: | ||
| echo " | echo " | ||
| done | done | ||
| - | exit 0 | ||
| </ | </ | ||
| - | On peut voir une syntaxe un peu particulière : <code bash> | + | On peut voir une syntaxe un peu particulière : |
| - | indiquer que ce qui est entre les parenthèses est une commande à exécuter. | + | <code bash> |
| + | Ceci sert à indiquer que ce qui est entre les parenthèses est une commande à exécuter. | ||
| - | On peut aussi utiliser | + | On peut aussi utiliser cette instruction simplement avec des nombres, cela permet de connaître le nombre d' |
| - | cette instruction simplement avec des nombres, cela permet de connaître le nombre d' | + | |
| <code bash> | <code bash> | ||
| #!/bin/sh | #!/bin/sh | ||
| Ligne 545: | Ligne 687: | ||
| echo $var | echo $var | ||
| done | done | ||
| - | exit 0 | ||
| </ | </ | ||
| - | On peut très bien aussi utiliser d' | + | On peut très bien aussi utiliser d' |
| - | caractères : | + | |
| <code bash> | <code bash> | ||
| #!/bin/sh | #!/bin/sh | ||
| Ligne 555: | Ligne 695: | ||
| echo $var | echo $var | ||
| done | done | ||
| - | exit 0 | ||
| </ | </ | ||
| Ligne 561: | Ligne 700: | ||
| - | ===== Les fonctions | + | ==== Les fonctions ==== |
| Les fonctions sont indispensables pour bien structurer un programme mais aussi pouvoir le simplifier, créer une tâche, la rappeler... Voici la syntaxe générale de ' | Les fonctions sont indispensables pour bien structurer un programme mais aussi pouvoir le simplifier, créer une tâche, la rappeler... Voici la syntaxe générale de ' | ||
| Ligne 573: | Ligne 712: | ||
| nom_fonction | nom_fonction | ||
| - | |||
| Rien ne vaut un petit exemple : | Rien ne vaut un petit exemple : | ||
| Ligne 588: | Ligne 726: | ||
| echo 'Vous allez voir la liste des fichiers de ce répertoire:' | echo 'Vous allez voir la liste des fichiers de ce répertoire:' | ||
| mafonction | mafonction | ||
| - | exit 0 | ||
| </ | </ | ||
| | | ||
| - | Comme vous l'avez sans doute remarqué, quand on appelle la fonction, on exécute simplement ce qu'on lui a défini au début, dans notre exemple, echo... et ls -l, on peut donc faire exécuter n' | + | Comme vous l'avez sans doute remarqué, quand on appelle la fonction, on exécute simplement ce qu'on lui a défini au début, dans notre exemple, echo... et ls -l, on peut donc faire exécuter n' |
| - | Les fonctions peuvent être définies n' | + | Les fonctions peuvent être définies n' |
| - | Exemple: | + | Exemple: |
| <code bash> | <code bash> | ||
| #!/bin/bash | #!/bin/bash | ||
| - | function | + | info(){ |
| echo -e " | echo -e " | ||
| exit | exit | ||
| Ligne 605: | Ligne 742: | ||
| test -z $(echo " | test -z $(echo " | ||
| test $1 -gt 0 || info "Je ne prends que les entiers > 0" | test $1 -gt 0 || info "Je ne prends que les entiers > 0" | ||
| - | function | + | print_until_sleep(){ |
| local COUNT=0 | local COUNT=0 | ||
| while [ -d /proc/$1 ]; do | while [ -d /proc/$1 ]; do | ||
| + | | ||
| test $(($COUNT%$2)) -eq 0 && echo -n " | test $(($COUNT%$2)) -eq 0 && echo -n " | ||
| COUNT=$(($COUNT+1)) | COUNT=$(($COUNT+1)) | ||
| Ligne 615: | Ligne 753: | ||
| echo -e " | echo -e " | ||
| </ | </ | ||
| - | ===== La couleur ===== | + | |
| + | |||
| + | ==== Extraire des sous-chaînes ==== | ||
| + | |||
| + | Pour extraire une chaîne d'une chaîne on utilise : **${ '' | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | Par exemple pour savoir ce que l'on aime manger en fonction de sa langue (vous êtes alors vraiment ultra geek 8-O !) : | ||
| + | <code bash> | ||
| + | # | ||
| + | # | ||
| + | if [ ${LANG:0:2} = " | ||
| + | echo "Vous aimez les moules frites !" | ||
| + | elif [ ${LANG:0:2} = " | ||
| + | echo "You love the... pudding !" | ||
| + | elif [ ${LANG:0:2} = " | ||
| + | echo "Te gusta el jamón !" | ||
| + | else | ||
| + | echo ":' | ||
| + | fi | ||
| + | #Noter que $LANG n'a pas le préfixe ' | ||
| + | </ | ||
| + | puis : | ||
| + | <code bash> | ||
| + | $ ./ | ||
| + | Vous aimez les moules frites ! | ||
| + | $ env LANG=en ./ | ||
| + | You love the... pudding ! | ||
| + | $ env LANG=es ./ | ||
| + | Te gusta el jamón ! | ||
| + | $ env LANG=it ./ | ||
| + | :'-( | ||
| + | </ | ||
| + | Ce code illustre un moyen de faire des scripts multilingues . | ||
| + | |||
| + | Une variante permet de tronquer uniquement le début de la chaîne. C'est **${ '' | ||
| + | Le tout peut s' | ||
| + | <code bash> | ||
| + | # | ||
| + | #truncbegin < | ||
| + | echo ${1:$2} | ||
| + | #Noter bien que echo ${1:2} tronquerait les 2 premiers caractères (et non le nombre indiqué par le 2e paramètre). | ||
| + | </ | ||
| + | puis : | ||
| + | <code bash> | ||
| + | $ ./ | ||
| + | world ! | ||
| + | </ | ||
| + | |||
| + | ==== La couleur ==== | ||
| Qui n’a jamais voulu faire un script avec des couleurs pour pouvoir différencier les titres des paramètres et les paramètres de leur valeur par exemple… | Qui n’a jamais voulu faire un script avec des couleurs pour pouvoir différencier les titres des paramètres et les paramètres de leur valeur par exemple… | ||
| === Présentation de la syntaxe === | === Présentation de la syntaxe === | ||
| + | |||
| Comme toute commande sous Linux, il faut utiliser une syntaxe par défaut et y passer quelques paramètres. Pour les couleurs au sein de scripts shell, c’est le même principe. | Comme toute commande sous Linux, il faut utiliser une syntaxe par défaut et y passer quelques paramètres. Pour les couleurs au sein de scripts shell, c’est le même principe. | ||
| <code bash> | <code bash> | ||
| echo -e ' | echo -e ' | ||
| </ | </ | ||
| - | Dans la commande passée ci-dessus, nous pouvons constater qu’il y a 3 paramètres présents, A, B et C. | + | Dans la commande passée ci-dessus, nous pouvons constater qu’il y a 3 paramètres présents: A, B et C.\\ |
| A : correspond à un effet affecté au texte affiché | A : correspond à un effet affecté au texte affiché | ||
| B : correspond à la couleur du texte | B : correspond à la couleur du texte | ||
| Ligne 631: | Ligne 821: | ||
| === Présentation des différentes valeurs Effet === | === Présentation des différentes valeurs Effet === | ||
| - | Nous allons commencer par les différents effets | + | |
| + | Nous allons commencer par les différents effets | ||
| ^Code^Effet^ | ^Code^Effet^ | ||
| Ligne 637: | Ligne 828: | ||
| |1|**Gras**| | |1|**Gras**| | ||
| |21|Non-gras| | |21|Non-gras| | ||
| + | |2|Sombre| | ||
| + | |22|Non-sombre| | ||
| + | |3|// | ||
| + | |23|Non-italique| | ||
| |4|__Souligné__| | |4|__Souligné__| | ||
| - | |24|Non souligné| | + | |24|Non-souligné| |
| |5|Clignotant| | |5|Clignotant| | ||
| |25|Non-clignotant| | |25|Non-clignotant| | ||
| |7|Inversé| | |7|Inversé| | ||
| |27|Non-inversé| | |27|Non-inversé| | ||
| + | |8|Invisible| | ||
| + | |28|Non-invisible| | ||
| + | |9|< | ||
| + | |29|Non-barré| | ||
| === Présentation des différentes valeurs des couleurs === | === Présentation des différentes valeurs des couleurs === | ||
| - | Maintenant que nous avons présenté les différents effets possibles d’attribuer à du texte, nous allons nous attaquer aux couleurs. Chaque couleur | + | |
| + | Maintenant que nous avons présenté les différents effets possibles d’attribuer à du texte, nous allons nous attaquer aux couleurs.\\ | ||
| + | Chaque couleur | ||
| ^Couleur^Couleur texte^Couleur fond^ | ^Couleur^Couleur texte^Couleur fond^ | ||
| |Noir|30|40| | |Noir|30|40| | ||
| Ligne 655: | Ligne 856: | ||
| |Cyan|36|46| | |Cyan|36|46| | ||
| |Blanc|37|47| | |Blanc|37|47| | ||
| + | |||
| === Exemple === | === Exemple === | ||
| + | |||
| <code bash> | <code bash> | ||
| echo -e ' | echo -e ' | ||
| </ | </ | ||
| + | |||
| ===== Exemples et exercices ===== | ===== Exemples et exercices ===== | ||
| - | Comme indiqué dans la [[script_shell# | + | Comme indiqué dans la [[script_shell# |
| - | [[http:// | + | [[https:// |
| - | Aux structures décrites ci-dessus, il est nécessaire, | + | Aux structures décrites ci-dessus, il est nécessaire, |
| - | La programmation de script shell étant ouverte à tous, cela permet de bénéficier de nombreux scripts pour des applications très variées ; cependant, **la plupart sont proposés sans aucune garantie**.\\ | + | La programmation de script shell étant ouverte à tous, cela permet de bénéficier de nombreux scripts pour des applications très variées ; cependant, **la plupart sont proposés sans aucune garantie**. |
| - | Vous pourrez trouver une liste de scripts pouvant servir d'exemple | + | Vous pourrez trouver une liste de scripts pouvant servir d'exemples |
| - | Une fois vos armes faites, proposez vos contributions sur le topic du forum [[http:// | + | Une fois vos armes faites, proposez vos contributions sur le topic du forum [[https:// |
| ===== L'art d' | ===== L'art d' | ||
| Ligne 679: | Ligne 883: | ||
| * Commencer par : <code bash># | * Commencer par : <code bash># | ||
| # Version du script</ | # Version du script</ | ||
| - | | + | * Créer des fonctions pour des actions précises :<code bash> |
| - | * À la fin de vos scripts, ajouter impérativement : <code bash> | + | |
| - | | + | |
| - | <code bash> | + | |
| - | nom_de_la_fonction() | + | |
| { | { | ||
| ... | ... | ||
| - | } | + | }</ |
| - | </ | + | * Utiliser des chemins |
| - | * Utiliser des chemins | + | |
| * Utiliser les entrées de commandes pour les fonctions :<code bash> | * Utiliser les entrées de commandes pour les fonctions :<code bash> | ||
| - | * Si votre script doit s' | + | * Si votre script doit s' |
| exit 101; | exit 101; | ||
| exit 102; | exit 102; | ||
| Ligne 707: | Ligne 906: | ||
| exit 100 | exit 100 | ||
| fi | fi | ||
| - | }</ | + | }</ |
| - | Évidemment ces conseils sont utiles au débutant... | + | <note tip> |
| - | <note tip> | + | |
| Exemple : | Exemple : | ||
| - | Supposons | + | supposons |
| éléphant bleu, éléphant blanc, éléphant rose ayant chacun 30 individus. | éléphant bleu, éléphant blanc, éléphant rose ayant chacun 30 individus. | ||
| Votre script doit compter le nombre d' | Votre script doit compter le nombre d' | ||
| Ligne 722: | Ligne 920: | ||
| Quel algorithme choisissez-vous ? | Quel algorithme choisissez-vous ? | ||
| - | Résultat : Le premier car dans le deuxième il faut d' | + | Résultat : le premier car dans le deuxième il faut d' |
| ===== Liens ===== | ===== Liens ===== | ||
| - | * (fr) http:// | ||
| - | * (fr) [[http:// | + | * (fr) [[https:// |
| - | * (fr) http://www.siteduzero.com/tutoriel-3-12827-reprenez-le-controle-avec-linux.html : Un tutoriel très complet pour linux qui comporte quelques parties sur la réalisation de scripts bash. | + | * (fr) [[https:// |
| + | * (fr) [[https:// | ||
| + | * (fr) https://openclassrooms.com/courses/reprenez-le-controle-a-l-aide-de-linux : Un tutoriel très complet pour linux qui comporte quelques parties sur la réalisation de scripts bash. | ||
| * (en) [[http:// | * (en) [[http:// | ||
| - | * (fr ) [[http:// | ||
| * (fr ) [[ftp:// | * (fr ) [[ftp:// | ||
| - | | + | * (fr ) [[http:// |
| - | | + | * (en) [[https:// |
| ---- | ---- | ||
| + | |||
| // | // | ||
| + | |||
