Les scripts shell:
Un shell n'est pas un simple interpréteur de commande mais il peut aussi exécuter des commandes
prises dans un fichier. Il existe plusieurs environnements console shell. Les principaux shells qui
existent :
sh : Bourne Shell. (Le shell original).
•bash : Bourne Again Shell. Une amélioration du Bourne Shell, disponible par défaut sous
Linux et Mac OS X.
•ksh : Korn Shell. Un shell puissant assez présent sur les Unix propriétaires, mais aussi
disponible en version libre, compatible avec bash.
•csh : C Shell. Un shell utilisant une syntaxe proche du langage C.
•tcsh : Tenex C Shell. Amélioration du C Shell.
•zsh : Z Shell. Shell assez récent reprenant les meilleures idées de bash, ksh et tcsh.
Un fichier contenant des commandes pour le shell ou un programme écrit dans le langage du shell
est appelé un script shell.
Un script shell peur comprendre des commandes, des variables et des structures de contrôle
(constructions conditionnelles et boucles).
Rendre un script shell exécutable
Pour que le shell sache comment interpréter le script, le code du script doit commencer par la ligne:
#!/bin/bash
La ligne " #!/bin/bash " indique que ce script doit être exécuté par le shell bash.
Le fichier contenant le script doit aussi être exécutable (bit "x" dans les permissions d’accès).
La commande chmod permet de modifier les permissions d'acces d'un fichier.
Pour rendre un fichier exécutable:
$ chmod u+x nom_du_fichier
Principes généraux des scripts shell
Un script shell est avant tout une succession de commandes.
Le programme script suivant permet d'afficher le répertoire de travail courant dans une ligne puis la
date système.
#!/bin/bash
pwd
date
Pour insérer des commentaires dans le script, il suffit de précéder chaque ligne de commentaire du
caractère "#". Exemple:
#!/bin/bash
# Ce qui est ici est un commentaire
pwd
date
echo : La commande echo sert à afficher du texte
#!/bin/bash
# Ce qui est ici est un commentaire
echo "Le répertoire de travail est:"
pwd
echo "Le date est:"
date
Les variables
Toute variable possède un nom et une valeur
<nom de la variable>=<la valeur de la variable>
Pour l'affichage d'une variable précéder son nom par le symbole dollar "$":
Exemple :
#!/bin/bash
i=10
echo " La valeur de la variable i est : $i"
message="Bonjour "
echo $message
read : La commande read permet de lire des variables. Elle demande à l'utilisateur de saisir du texte.
#!/bin/bash
read nom
echo " Bonjour $nom"
read permet aussi de lire plusieurs variables :
#!/bin/bash
read nom prenom
echo " Bonjour $nom $prenom"
Les back quotes ` `
En shell les back quotes indiques au shell d’exécuter ce qui trouve à l’intérieur :
Exemple :
#!/bin/bash
rep=`pwd`
echo "vous êtes dans le répertoire $rep"
La variable rep recevra comme valeur le résultat d’exécution de la commande pwd.
Par la suite, echo affiche le message :
vous êtes dans le répertoire /home/user
Les variables des paramètres
Les scripts bash peuvent accepter des paramètres comme toute autre commande.
Le scritp peut être appelé :
$ ./[Link] param1 param2 param3
$* donne tous les paramètres
$@ donne la liste des paramètres
$# donne le nombre de paramètres
$0 donne le nom de la commande
$1 donne le premier paramètre, $2, $3 …
Exemple:
#!/bin/bash
echo "Le nom du fichier script est : $0"
echo "Nombre de paramètres : $#"
echo "Le premier paramètre : $1"
echo "Le deuxième paramètre : $2"
Examiner une condition : if et case
La structure if
Le type de condition le plus courant est le if, qui signifie "si".
Si la condition est correcte exécuter des instructions si non exécuter d'autres instructions.
La syntaxe en bash est la suivante :
#!/bin/bash
i=10
if [ $i -lt 20 ]
then
echo "i est inférieur à 20 "
else
echo "i est supérieur ou égale à 20 "
fi
Il existe deux principales façons de réaliser des tests pour évaluer une expression. Ces deux
méthodes sont l'utilisation de la commande test, et l'utilisation des crochets :
•test expression
•[ expression ]
Syntaxe de test :
test condition
Les différents types de tests
Il est possible d’effectuer trois types de tests différents en bash :
•des tests sur des chaînes de caractères ;
•des tests sur des nombres ;
•des tests sur des fichiers.
Tests sur des chaînes de caractères
Condition Signification
Vérifie si les deux chaînes sont identiques. Notez que bash est
$chaine1 = $chaine2 sensible à la casse : « b » est donc différent de « B ».
Il est aussi possible d'écrire « == » pour les habitués du langage C.
$chaine1 != $chaine2 Vérifie si les deux chaînes sont différentes.
-z $chaine Vérifie si la chaîne est vide.
-n $chaine Vérifie si la chaîne est non vide.
Exemple :
#!/bin/bash
if [ -z $1]
then
echo "pas de paramètres "
else
echo "le paramètre 1 est : $1 "
fi
Tests sur des nombres
Les opérateurs sont les suivants :
•-eq (equal) : « égal à » (signe « = ») ;
•-ne (not equal) : « différent de » (signe « ≠ ») ;
•-gt (greater than) : « strictement supérieur à » (signe « > ») ;
•-lt (lesser than) : « strictement inférieur à » (signe « < ») ;
•-ge (greater or equal) : « supérieur ou égal à » (signe « ≥ ») ;
-le (lesser or equal) : « inférieur ou égal à » (signe « ≤ ») ;
Exemple :
#!/bin/bash
i=10
if test $i -lt 20
then
echo "i est inférieur à 20 "
else
echo "i est supérieur ou égale à 20 "
fi
Tests sur des fichiers
Une grande partie de la puissance du shell se déploie dans sa faculté de manipuler des fichiers.
Les principaux opérateurs disponibles sont :
•nature du fichier :
•-e (exists) : vérifie l'existence d'un fichier ;
•-f (file) : vérifie l'existence d'un fichier, et le fait qu'il s'agisse bien d'un fichier au
sens strict ;
•-d (directory) : vérifie l'existence d'un répertoire ;
•-L (link) : vérifie si le fichier est un lien symbolique ;
•attributs du fichier :
•-s (size) : vérifie qu'un fichier n'est pas vide ;
•droits sur le fichier :
•-r (readable) : vérifie si un fichier peut être lu ;
•-w (writable) : vérifie si un fichier peut être écrit ou modifié ;
•-x (writable) : vérifie si un fichier peut être exécuté ;
•comparaison de fichiers :
•-nt (newer than) : vérifie si un fichier est plus récent qu'un autre ;
•-ot (older than) : vérifie si un fichier est plus ancien qu'un autre.
Exemple :
#!/bin/bash
read -p 'Entrez un répertoire : ' repertoire
if [ -d $repertoire ]
then
echo "Le répertoire existe."
else
echo "Le répertoire n'existe pas."
fi
Opérateurs logiques
L'opérateur « ! »: Non
L'opérateur « && »: Et logique (l'opérateur « -a »)
L'operateu « || »: Ou logique (l'opérateur « -o »)
Exemple :
#!/bin/bash
if [ $# -ge 1 ] && [ $1 = 'Hello' ]
then
echo "le premier parametre est Hello "
echo "Il existe au moins un parametre"
fi
Exemple de Elseif
#!/bin/bash
if [ $# -eq 1 ]
then
echo "Il existe un paramètre"
elif [ $# -eq 2 ]
then
echo "Il existe deux paramètres"
elif [ $# -gt 2 ]
echo "Il existe plus que deux paramètres"
else
echo "Il n'existe aucun paramètre"
fi
La structure case
Case : tester plusieurs conditions à la fois
Exemple :
#!/bin/bash
case $1 in
0)
echo "le parametre 1 est egal à 0"
;;
1)
echo "le parametre 1 est egal à 1"
;;
*)
echo "Je ne connais pas le contenu du parametre 1
!"
;;
esac
Exemple :
#!/bin/bash
case $1 in
"Chien" | "Chat" | "Souris")
echo "C'est un mammifère"
;;
"Moineau" | "Pigeon")
echo "C'est un oiseau"
;;
*)
echo "Je ne sais pas ce que c'est"
;;
esac
expr : utilisé pour réaliser des opérations arithmétique
syntaxe : expr $nbr1 opérateur $nbr2
Opérateurs:
Opérateurs Signification
Opérateurs arithmétiques
$nb1 + $nb2 Addition
$nb1 - $nb2 Soustraction
$nb1 \* $nb2 Multiplication
$nb1 / $nb2 Division
$nb1 % $nb2 Modulo
Opérateurs de comparaison
$nb1 \> $nb2 VRAI si $nb1 est strictement supérieur à $nb2
$nb1 \>= $nb2 VRAI si $nb1 est supérieur ou égal à $nb2
$nb1 \< $nb2 VRAI si $nb1 est strictement inférieur à $nb2
$nb1 \<= $nb2 VRAI si $nb1 est inférieur ou égal à $nb2
$nb1 = $nb2 VRAI si $nb1 est égal à $nb2
$nb1 != $nb2 VRAI si $nb1 est diférent de $nb2
Opérateurs logiques
Opérateurs Signification
$chaine1 \& $chaine2 VRAI si les 2 chaines sont vraies
$chaine1 \| $chaine2 VRAI si l'une des 2 chaines est vraie
Opérateurs divers
-$nb1 Opposé de $nb1
\( expression \) Regroupement
$chaine : expression_reguliere Compare la chaine avec l'expression régulière
Exemple :
#!/bin/bash
i=`expr $1 + $2`
echo "$1 + $2 = $i"
Répéter une procédure: while et for
while : boucler « tant que »
#!/bin/bash
echo "Donner un entier entre 1 et 10 : "
read i
while [ $i -lt 1 ] || [ $i -gt 10 ]
do
read -p 'donner un entier entre 1 et 10 : ' i
done
for : boucler sur une liste de valeurs
Parcourir une liste de valeurs
La boucle for permet de parcourir une liste de valeurs et de boucler autant de fois qu'il y a de
valeurs.
Exemple :
#!/bin/bash
listedefichiers=`ls`
for fichier in $listedefichiers
do
echo "Fichier trouvé : $fichier"
done
Une boucle for avec indice de boucle
#!/bin/bash
for (i=1;i<10;i++)
do
m=`expr $1 + $i`
echo "$1 + $i = $m"
done