Grégory Bonnet gregory.bonnet@unicaen.fr GREYC Université Caen Basse Normandie Diaporama original : Jean-Philippe Métivier Boris Lesner
Un script bash? script bash = une suite d instructions dans le langage utilisé par les terminaux = un petit programme utilisant les instructions et commandes des terminaux hello.sh!/bin/bash Pour exécuter un script bash : echo "Hello World!" soit on donne les droits d exécution au script et on l exécute de la manière suivante./hello.sh ; soit on le lance grâce à l interpréteur bash de la manière suivante sh hello.sh.
Les variables Une variable permet de stocker une valeur et peut être utilisée pour désigner cette valeur. Le nom d une variable est une chaîne de alphanumérique : une chaîne de caractères commençant par au moins une lettre puis une suite de lettres ou de chiffres. Deux opérations peuvent être effectuées : 1 donner une valeur (affectation) : nom variable=valeur 2 lire le contenu d une variable : $nom variable hello2.sh!/bin/bash nom="john Doe" echo "Hello $nom!"
Les variables d environnement Certaines variables sont utilisées par le système : elles sont appelées des variables d environnement : $USER et $UID : donne le login et l identifiant de l utilisateur connecté $HOME et $PWD : donne le chemin absolu des répertoires home et courant de l utilisateur connecté... On peut lister les variables d environnement utilisées par le système grâce à la commande env et en ajouter temporairement grâce à export.
Les valeurs passées en arguments On peut passer des valeurs en argument à un script (exactement comme pour une commande). jdoe@trantor : $ sh script.sh argument1 argument2 $0 le nom du script exécuté ${i} le i ieme argument $ le nombre d arguments $* une chaine de caractères de tous les arguments $? code de retour d un programme La fonction shift permet de décaler les arguments d un rang vers la gauche : le deuxième devient le premier, le troisième le deuxième et ainsi de suite. N.B. shift n de même que shift mais avec un décalage de n.
À vous de jouer Écrire un script saluant l utilisateur avec son nom et lui donnant la date : en utilisant la variable d environnement stockant le login ; en utilisant une valeur passée en argument. Écrire un script affichant le nom du script, le nombre d arguments et la liste des arguments.
Évaluer une expression On peut effectuer des opérations arithmétiques : + la somme - la soustraction * la mutilplication / la division (en nombre entier) Pour évaluer une opération, on utilise : $((operation)) operation.sh valeur1=5 valeur2=3 chaine=$valeur1+$valeur2-1 resultat=$(($valeur1+$valeur2-1)) echo "L operation $chaine a pour resultat $resultat"
Évaluer une expression Comparer des chaînes de caractères : égalité =... différence!= Comparer des entiers : égalité -eq différence -ne plus petit -lt plus grand -gt pp ou égale -le... pg ou égale -ge test valeur op valeur [ valeur op valeur ] N.B. : les espaces sont importants.
Branchement conditionnel : if if (si en anglais) est une structure qui permet d exécuter une suite d instructions si un test est verifié. Exemple : if condition...then instruction fi if test "$1" -lt 10...then le premier argument est inférieur a 10 fi
Branchement conditionnel : if On peut ajouter le bloc optionnel else pour exécuter des instructions en cas où le test serait faux. Exemple : if condition...then instruction OK...else instruction KO fi if [ "$1" = "pass" ]...then echo "le mot pass"...else echo "pas le mot pass" fi
À vous de jouer Écrire un script qui calcule pour deux nombres passés en arguments leur somme et leur produit. Écrire un script qui vérifie si le login donné en entrée est celui de la personne connectée au terminal. Écrire une petite calculatrice qui prend en entrée le premier nombre puis l operateur et le second nombre, et qui affiche l opération et son résultat.
Conditions multiples On peut écrire des tests liés par et en utilisant -a : if [ "$jour" = 11 -a "$mois" = novembre ]...then echo "jour ferie" fi On peut écrire des tests liés par ou en utilisant -o : if [ "$we" = 1 -o "$ferie" = 1 -o $vacances = 1 ]...then echo "repos" fi Ou la négation de la condition (!) : if [! $1 -lt 5 ]...then echo "superieur ou egal a 5" fi
Boucle conditionnelle : while L instruction while (tant que en anglais) permet d exécuter des instructions tant qu un test est verifié : while condition ; do... instruction done Exemple : un while qui compte des moutons. i=0 while [ $i -le $1 ]; do... echo $i moutons... i=$(($+1)) done
Itération : for L instruction for (pour en anglais) permet d exécuter des instructions sur chaque élement d une liste : Exemple : for variable in liste ; do... instruction done for f in 1 2 3 4; do echo $f done for f in seq 1 4 ; do echo $f done for f in $(ls); do cat $f done
À vous de jouer Écrire un script retournant la factorielle de la valeur passée en entrée (rappel : factoriel(5)= 1 2 3 4 5) Écrire un script dessinant un carré de côté n. * *** dessine rectangle(3) *** *** De même avec un triangle rectangle isocèle de côté n. * * dessine triangle(3) ** ***
Fonctionnalités diverses La fonction read permet de lire une entrée clavier. jdoe@trantor: $ read x 50 jdoe@trantor: $ echo $x 50 La variable $RANDOM retourne un nombre aléatoire. Pour que le nombre soit compris entre 0 et n (non inclus) on peut utiliser le modulo (%). echo Un nombre entre 1 et 10 : $(($RANDOM%10+1))
À vous de jouer Le calcul mental : écrire un petit jeu de calcul mental en proposant deux nombres (entre 1 et 10) et un operateur (+ ou *) et qui attend la réponse du joueur. Une fois la réponse donnée le script vérifie le résultat s il est bon. La basse-cour : tant que la valeur passé en argument n est pas atteinte, on tire un nombre aléatoire entre 0 et 3 et on ajoute un animal dans la basse-cour (si c est un 0 il s agit d un mouton, pour 1 d un cochon, 2 d une poule et 3 un vache). Après avoir fait l ajout à la basse-cour de l animal, le script affiche le nombre de fois que chacun des animaux est présent dans la basse cour.
case Plutôt qu enchaîner les if, on peut utiliser un case : Exemple : case "$variable" in... motif1) instruction1 ;;... motif2) instruction2 ;;... *) instruction ;; esac for f in $(ls); do...case "$f" in...*.temp ) rm $f ;;...*.css ) mv $f style;; esac
À vous de jouer La basse-cour : réécrire basse-cour avec un case plutot qu un if.
Test sur les fichiers Il existe des tests particuliers pour les fichiers -e le fichier existe? -d le repetoire existe? -f le fichier regulier existe? -r le fichier possède les droits de lecture? -w le fichier possède les droits d écriture? -x le fichier possède les droits d exécution? Exemple : for f in $(ls); do... if [ -f $f -a -x $f ]...... then echo $f... fi done
Écrire des fonctions Un fonction permet de factoriser un morceau de code qui sera souvent appelé. function nom fonction () { commande } Les arguments de la fonction n ont pas besoin d être spécifiés lors de sa définition et sont accessibles grâce à $1,...
Écrire des fonctions factoriel.sh #!/bin/bash function factorielle () { res=1 for i in seq 1 $1 ; do res=$(($res*$i)) done echo $res } factorielle 1 factorielle 10