Travaux Pratiques Linux

Programming, Linux, Shell Scripting · lab

Voir tous les documents en systèmes d'exploitation et cloud

Travaux Pratiques Linux

Le Shell: programmation et ecriture de scripts

08/05/2020

1. Introduction Les scripts Shell vous permettent de :

 Simplifier une procédure complexe  Manipuler des scripts Init  Déploiement logiciel : installateur de binaire, avec compilation, avec dépôts de paquetages  Supervision de parc, Exploitation de journaux, Tâches de maintenances périodiques  Configuration, gestion, maintenance, surveillance d’environnements virtualisés  Gestion spécifique à la production :  Bases de données  Services Web  Services d’infra  Services de traitement (batch)  …

2. Création d’un script Shell : Créer un script shell revient utiliser un éditeur de fichier tels que vi/vim, nano ou bien d’autre éditeurs qui dépendent de votre distribution. L’éditeur le plus utilisé par les administrateurs système est vim. Ci-dessous, vous trouverez certaines commandes utiles de l’utilisation de vim :

 Trois modes : commandes, édition, dernière ligne  Numérotation des lignes : :set nu  Début du fichier : gg  Fin du fichier : G  Ligne 25 : 25G ou :25  Quitter sans sauver : :q!  Sauver : :w  Quitter et Sauver: :x ou Shift ZZ

T1 : Créez un fichier avec vim nommé « script1test.sh » et tapez le code suivant de votre premier script :

#!/bin/bash #les commentaires commence par '#' #exemple des manipulations de la commande : test

#1- Déclaration d'une variable MESSAGE="Bonjour 1ALINIFO" #2- Affichage de la valeur echo $MESSAGE

3. Invocation de l’interpréteur T2 : Invoquez ce script monscript.sh avec bash :

T3 : Renommez le fichier « script1test.sh » en « script1test » et invoquez avec bash :

Vous remarquez que l’extension qui dénomme le script n’a aucune portée pour le shell. NOTE Le Shebang (# !/bin/bash) indique au système quel interpréteur doit utiliser pour lancer les commandes. Si l’interpréteur de commandes n’est pas déclaré, le shell courant prend en charge les commandes du script. 4. Exécution directe du script : T4 : attribuez le droit d’exécution au script et exécutez comme suit :

R4 : …………………………………………………………………………………………………..

T5 : Comment rendre le script accessible depuis n’importe quel emplacement ? voir figure

suivante :

R5 :………………………………………………………………………………………………… ……………………………………………………………………………………………………

5. Les expressions conditionnelles et les structures de contrôle

5.1. La commande test

La commande interne test ou [ ] permet de contrôler l'exécution de votre script shell à partir du code de retour d'une expression. Comme nous l'avons déjà vu, un code retour égal a 0 est considéré comme vrai alors qu'un code retour non nul sera considéré comme faux. II est alors très simple de tester la bonne exécution d'une commande : #!/bin/bash classe="1ALINFO3"

if [ $classe = "1ALINFO3" ] then echo "Bonjour 1ALINFO3 de Vermeg !" fi

Ou bien on pourra écrire le même code comme suit :

#!/bin/bash classe="1ALINFO3"

if test $classe = "1ALINFO3" then echo "Bonjour 1ALINFO3 de Vermeg !" fi

L'évaluation d'expressions concernant le type ou les droits d'accès des fichiers sont prévus avec

l'utilisation d'options. Les tableaux suivants vous donnent quelques options.

Options -a fichier ou -e fichier -b fichier -c fichier -d fichier -f fichier -p fichier -s fichier -L fichier fichierl -nt fichierS fichierl -ot fichierS fichierl -ef fichierS

Vraie si le fichier existe le fichier existe et est de type bloc le fichier existe et est de type caractère le fichier existe et c'est un répertoire le fichier existe et c'est un fichier régulier le fichier existe et c'est un tube nomme le fichier existe et a une taille non nulle le fichier existe et c'est un lien symbolique fichierl est plus récent que fichier2 fichierl est moins récent que fichier2 les 2 fichiers ont le même numéro d'inode (lien simple)

Publicité

Options -r fichier -w fichier -x fichier -g fichier -k fichier -u fichier -O fichier

Vraie si le fichier est lisible le fichier est modifiable le fichier est exécutable le fichier possède le bit set-gid le fichier possède le bit sticky le fichier possède le bit set-uid

le fichier a le propriétaire du processus comme propriétaire

-G fichier

le fichier a le groupe du processus comme groupe

D'autres options permettent de manipuler des chaines de caractères pour des comparaisons lexicographiques (options = != < et >) et des comparaisons numériques (options -eq, -ne, -It, -le, -gt et -ge). Vous trouverez celles-ci dans le tableau ci-dessous.

Options -n chaine -z chaine chainel -eq chaineS chainel -ne chaineS chainel -gt chaineS chainel -ge chaineS chainel -It chaineS chainel -le chaineS chainel = chains chainel != chaineS chainel > chains chainel < chaineS

Vraie si la chaine est de longueur non nulle la chaine est de longueur nulle les 2 valeurs sont égales les 2 valeurs sont différentes la valeur chainel est la plus grande la valeur chainel est plus grande ou égale la valeur chainel est plus petite la valeur chainel est plus petite ou égale les 2 chaines sont égales les 2 chaines sont différentes chainel est la plus grande chainel est la plus petite

II est possible de combiner ces expressions entres elles avec des parenthèses en utilisant l'operateur de

négation " !" et les opérateurs logiques ET et OU.

5.2. Les structures de contrôle

Vous trouverez ci-dessous un exemple pour chacune des structures de contrôle utilisables dans le

bash.

La construction if

if [ -e UNIX5.tex -a -r UNIX5.tex ] then

echo -e "Le fichier existe\n" echo -e "Et il est lisible\n"

else

fi

echo -e "Le fichier n'existe pas\n"

Premier cas if [ -f myfile ] then echo "cas 1 --- Le fichier myfile existe." else echo "cas1 --- Le fichier n'existe pas" fi

Deuxième cas if [ ! -f myfile ] then echo "cas2 --- Le fichier n'existe pas." else echo "cas2 --- fichier existe" fi

La construction case

case 'echo $SHELL' in

'/bin/bash') echo -e "Votre shell est le bash\n";; '/bin/tcsh') echo -e "Votre shell est le tcsh\n";; '/bin/csh') echo -e "Votre shell est le csh\n";; *) echo -e "Je ne connais pas votre shell\n";;

esac

La construction for

set a b c

for i in $*

Publicité

do

done

echo $i

La construction select

La commande select est particulièrement bien adaptée pour réaliser des menus interactifs. En voici

un exemple :

PS3="Votre Ghoix: " select COM in fin Is 'cat /etc/profile' do

if [ "$C0M" = fin ] then

echo "Vous avez choisi $REPLY" exit 0

else

echo -e "Vous avez choisi $REPLY\n" $C0M

fi

done

La construction while

1=0 while [ $1 -It 10 ] do

echo $1 let I=$I\+1

done

La construction until

1=0 until [ $1 -gt 256 ] do

echo $1 let I=$I\+2

done

le mot clef break

II permet de forcer la sortie d'une boucle for, while ou until. Le mot clef break peut prendre un argument strictement supérieur a 1 afin de spécifier le nombre de boucles imbriquées dont il faut sortir. Si la valeur spécifiée est supérieure au nombre de boucles imbriquées, on sort de toutes les boucles imbriquées.

le mot clef continue

II permet de passer a la prochaine itération d'une boucle for, while ou until. Le mot clef continue peut aussi prendre un argument strictement supérieur a 1 afin de spécifier le nombre d'itérations à "sauter". Si la valeur spécifiée est supérieure au nombre d'itérations possibles, la dernière itération est toutefois exécutée.

Le mot clef exit

II permet de stopper le programme en précisant en argument le code retour. Par convention, ce code retour est un entier nul en cas de sortie normale du programme et non nul en cas de fin de programme avec erreur.

5.3. Saisie sur la ligne de commande

Publicité

Afin de realiser un script shell interactif, il est necessaire de pouvoir saisir des valeurs. La commande interne au bash read interrompt le programme pour demander une saisie terminee par un retour chariot. La commande peut etre suivie d'une variable pour stocker la valeur.

read A - Alternance echo $A -Alternance

3 Calcul numérique

La commande interne let permet d'effectuer des calculs arithmétique dans le shell. Cependant l'interpréteur de commande bash ne permet pas d'effectuer des calculs en virgule flottante. Pour ces opérations, nous sommes obligés de faire appel a une commande externe, la commande be. Cette commande prend des données a calculer sur son entrée standard et affiche le résultat sur sa sortie standard. L'option "-1" permet de charger la bibliothèque mathématique.

$ 1=23 $ let J=$I\+100 $ echo $J $ 123 $ RES=<echo 3/41 be -lc $ echo $EES $ .75000000000000000000

4 Gestion évoluée de la ligne de commande

La syntaxe générale " commande [-options] arguments" est utilisée pour les commandes Unix. Nous avons étudié dans un précèdent T.P. comment obtenir les argument de la ligne de commande ($0, $1,...). II existe une commande qui permet une gestion plus évoluée des arguments de la ligne de commande : getopts.

Prenons l'exemple suivant :

while getopts ":ab:c" opt do

case $opt in

a) echo "Traitement de l'option -a";; b) echo "Traitement de l'option -b"

echo "L'argument est $0PTARG";;

c) echo "Traitement de l'option -c" ?) echo "Usage: commande [-a] [-b arg] [—c] arguments"

exit 1;;

esac

done shift $(($0PTIND-1))

echo "$1 est le premier argument apres les options..."

L'appel à getopts dans la boucle while prépare la boucle a accepter les options -a, -b et -c et spécifie que l'option -b doit traiter un argument ( :). Le : qui se trouve au début permet de traiter la saisie d'options invalides et place ? dans la variable lopt. Si une option prend un argument, la valeur de celui-ci sera contenu dans IOPTARG

Pour chaque option spécifiée sur la ligne de commande, une variable nominée IOPTIND est incrémentée. Par exemple, si vous spécifiez 2 options (-ab), la variable vaudra 2. Cela explique le décalage des arguments qui est effectué par la commande shift afin de retrouver les "vrais" arguments de la commande avec les variables $1, $2, etc...

Exercices

Conversion Euros/Francs et Francs/Euros

Première partie

Réalisez un script appelé " Convertisseur" qui vous permettent de convertir en Euros une somme en Francs passée en argument. Le taux de conversion sera contenu dans un fichier nomme Taux sous la forme : Taux :6.55957. Pensez a tester si ce fichier est existant et lisible par votre processus. Si ce n'est pas le cas, votre script doit afficher une erreur et quitter en indiquant un code retour 1.

Seconde partie

Modifiez votre script afin de pouvoir traiter l'option -e qui permet d'inverser la conversion (Euros vers Francs). En cas d'erreur de syntaxe, le script affiche l'usage du programme et quitte avec un code retour egal a 2.

Dernière partie

Modifiez votre script afin de pouvoir traiter l'option -f FILE qui permet d'indiquer un fichier dans lequel se trouve plusieurs sommes a convertir (une par ligne). Les résultats des conversions seront places dans un fichier nomme " Resultats".