Création de scripts Jean-Baptiste Vioix (jb.vioix@free.fr) LE2I - ENESAD http://jb.vioix.free.fr 1-27
Introduction à la création de script Diverses opérations nécessitent de nombreuses commandes répétitives. Pour éviter une saisie fastidieuse, on les regroupe dans des fichiers qui seront interprétés par le shell. Ces scripts peuvent accepter des paramètres lors du lancement afin de modifier le résultat. Les scripts sont des fichiers textes qui peuvent être éxécutés. La première ligne contient #!/bin/bash pour indiquer que l interpréteur est bash. Les commentaires sont précédées de # http://jb.vioix.free.fr 2-27
Définitions Prédéfinies Tableaux Définition et accès L utilisateur peut définir des variables à l aide du symbole = Pour accéder au contenu d une variable, on fait précéder son nom de $ Exemple : [iqs@pc]$ val=5 [iqs@pc]$ echo val val [iqs@pc]$ echo $val 5 Le symbole = est un symbole d affectation ( On affecte la valeur 5 à val ). http://jb.vioix.free.fr 3-27
Définitions Prédéfinies Tableaux prédéfinies Pour faciliter la création de scripts, un certain nombre de variables sont prédéfinies. Les paramètres sont référencés par les variables 1, 2,... (on y accède avec $1, $2,...) La variable * contient la liste des paramètres d appel (on y accède avec $*). La variable # contient le nombre de paramètres d appel (on y accède avec $#). La variable? (accès $?) contient le code de retour de la dernière commande (0 pour un succès, sinon un autre chiffre). http://jb.vioix.free.fr 4-27
Définitions Prédéfinies Tableaux Tableaux bash permet de définir des variables de type tableau On ne peut définir que des tableaux mono-dimensionnels de chaînes de caractères (mots). Les éléments sont séparés par des espaces. Le premier élément a l indice 0. http://jb.vioix.free.fr 5-27
Définitions Prédéfinies Tableaux Tableaux Pour remplir un tableau avec une liste de mots, on les encadre des (). On peut aussi utiliser le résultat d une commande. TabMots=(une liste de mots) TabLs= ( ls ) Pour accéder au contenu d une case, on doit utiliser $ comme pour une variable, mais il doit être protégé par { }. [iqs@pc]$ echo ${TabMots[1]} liste L ensemble des éléments est désigné par * : [iqs@pc]$ echo ${TabMots[*]} une liste de mots Le nombre d éléments est accessible avec # : [iqs@pc]$ echo ${#TabMots[*]} 4 http://jb.vioix.free.fr 6-27
conditionnelles itératives Des opérations arithmétiques peuvent être effectuées sur les variables. On utilise la commande expr. [iqs@pc]$ expr 1 + 2 3 Les opérations possibles sont : Addition et soustraction : $a + $b et $a - $b Produit : $a \* $b Quotient : $a / $b Modulo : $a % $b http://jb.vioix.free.fr 7-27
conditionnelles itératives Tests La commande test permet d effectuer des tests booléen sur des variables. La syntaxe est la suivante test expression ou [ expression ], test renvoie 0 si le résultat est vrai, 1 sinon. http://jb.vioix.free.fr 8-27
conditionnelles itératives Tests sur les valeurs entières Les principaux tests sur des valeurs entières sont : a -eq b retourne vrai si a=b. a -ne b retourne vrai si a b. a -ge b retourne vrai si a b. a -gt b retourne vrai si a>b. a -le b retourne vrai si a b. a -lt b retourne vrai si a<b. http://jb.vioix.free.fr 9-27
conditionnelles itératives Tests sur les chaînes de caractères Les principaux tests sur des chaînes de caractères sont : str1 = str2 retourne vrai si str1 et str2 sont identiques. str1!= str2 retourne vrai si str1 est différente de str2. str retourne vrai si str n est pas nulle. -n str retourne vrai si la longueur de str est supérieure à zéro. -z str retourne vrai si la longueur de str est égale à zéro. http://jb.vioix.free.fr 10-27
conditionnelles itératives Tests sur les fichiers Les principaux tests sur les fichiers sont : -d fic retourne vrai si fic est un répertoire. -f fic retourne vrai si fic est un fichier. -r fic retourne vrai si fic peut être lu. -w fic retourne vrai si fic peut être écrit. -x fic retourne vrai si fic peut être exécuté. -s fic retourne vrai si la taille de fic est non nulle. http://jb.vioix.free.fr 11-27
conditionnelles itératives Alternatives simples L alternative la plus simple est de la forme : si...alors...sinon La syntaxe est la suivante : if <ListeDeCommandes1>; then <ListeDeCommandes2> else <ListeDeCommandes3> fi La <ListeDeCommandes2> est exécutée si <ListeDeCommandes1> (souvent un test) renvoie 0, sinon c est la <ListeDeCommandes3> qui est exécutée. http://jb.vioix.free.fr 12-27
conditionnelles itératives Alternatives simples Une commande UNIX réussie renvoie 0 ; si elle échoue, elle renvoie 1. On peut omettre la seconde partie de l alternative. On peut quitter un script à l aide de la commande exit <n>, où <n> est un chiffre. Généralement, on suit les conventions ci-dessus. http://jb.vioix.free.fr 13-27
conditionnelles itératives Alternatives simples Plusieurs alternatives peuvent être groupées : if <ListeDeCommandes1>; then <ListeDeCommandes2> else if <ListeDeCommandes3>; then <ListeDeCommandes4> else if <ListeDeCommandes5>; then <ListeDeCommandes6>... fi fi fi http://jb.vioix.free.fr 14-27
conditionnelles itératives Alternatives simples Cette notation se simplifie à l aide de la syntaxe suivante : if <ListeDeCommandes1>; then <ListeDeCommandes2> elif <ListeDeCommandes3>; then <ListeDeCommandes4> elif <ListeDeCommandes5>; then <ListeDeCommandes6> fi http://jb.vioix.free.fr 15-27
conditionnelles itératives Choix multiples Lorsque le choix correspond à plusieurs alternatives, l instruction case permet de créer des choix d une manière plus simple que la structure précédente. case <str> in <str1>)) <ListeDeCommandes1>;; <str2>)) <ListeDeCommandes2>;;... *)) <ListeDeCommandesD>;; esac http://jb.vioix.free.fr 16-27
conditionnelles itératives Choix multiples Si la chaine <str> correspond à la chaine <str1>, on exécute la <ListeDeCommandes1>. Si la chaine <str> correspond à la chaine <str2>, on exécute la <ListeDeCommandes2>, etc... Dans les autres cas, la <ListeDeCommandesD> est exécuté. Les chaines <str1>... peuvent être des expressions régulières. http://jb.vioix.free.fr 17-27
conditionnelles itératives Exemples Teste si la variable val (qui vaut 10) est supérieure à 5. #!/bin/bash val=10 if [ $val -ge 5 ]; then echo "Valeur supérieure à 5" else echo "Valeur inférieure à 5" fi Usage : test ou./test http://jb.vioix.free.fr 18-27
conditionnelles itératives Exemples Teste si la variable passée en paramètre est supérieure à 5. #!/bin/bash if [ $1 -ge 5 ]; then echo "Valeur supérieure à 5" else echo "Valeur inférieure à 5" fi Usage : test 5 ou./test 5 http://jb.vioix.free.fr 19-27
conditionnelles itératives Exemples Teste si la variable passée en paramètre existe et si elle est supérieure à 5. #!/bin/bash if [ $# -ne 1 ]; then echo "usage : $0 valeur "; exit 1; fi if [ $1 -ge 5 ]; then echo "Valeur supérieure à 5" else echo "Valeur inférieure à 5" fi http://jb.vioix.free.fr 20-27
conditionnelles itératives itératives Le langage de script permet de répéter un bloc d instructions. Les instructions sont comprises entre les instructions do et done. Deux cas se présentent : le nombre de répétitions est fixé avant l exécution OU le nombre de répétitions est fixé par une condition (d arrêt ou de répétition). http://jb.vioix.free.fr 21-27
conditionnelles itératives itératives L instruction for permet de répéter le bloc d instruction pour un nombre fini d éléments : for <variable> in <list> do <instructions> done La liste peut avoir différentes syntaxes : Liste exhaustive : 1 2 3 4 5 Variable, par exemple pour tous les arguments : $* Tableau : ${tab[*]} Résultats d une commande : ls http://jb.vioix.free.fr 22-27
conditionnelles itératives itératives Deux fonctions permettent de construire des boucles non bornées. La fonction while permet de répéter un bloc d instruction tant que le test est VRAI : while <test> do <instructions> done La fonction until permet de répéter un bloc d instruction jusqu à ce que le test soit VRAI : until <test> do <instructions> done http://jb.vioix.free.fr 23-27
conditionnelles itératives Exemples Décompte de 9 à 0 avec une boucle for #!/bin/bash for val in 9 8 7 6 5 4 3 2 1 0 do echo $val done http://jb.vioix.free.fr 24-27
conditionnelles itératives Exemples Décompte de 9 à 0 avec une boucle while #!/bin/bash val=10 while [ $val -ne 0 ] do val= expr $val - 1 echo $val done http://jb.vioix.free.fr 25-27
conditionnelles itératives Exemples Décompte de 9 à 0 avec une boucle until #!/bin/bash val=10 until [ $val -eq 0 ] do val= expr $val - 1 echo $val done http://jb.vioix.free.fr 26-27
conditionnelles itératives Récursivité Un script shell peut s appeler lui-même. Comme pour tous les appels récursifs, on doit veiller à prévoir une condition d arrêt de la récursivité. http://jb.vioix.free.fr 27-27