Shell script
Un script Shell se présente sous la forme d’un fichier contenant une ou plusieurs commandes qui seront exécutées de manière séquentielle. Il pourra donc permettre d’automatiser une série d’opérations.
Les opérateurs de test
Lors d’un test ( [ expression ] ou test expression ), le code de retour sera de 0 si l’expression est vrai ou de 1 si l’expression est fausse.
Test sur les objets
- [ -d fichier ]
- Vrai si le fichier existe et est un répertoire.
- [ -e fichier ]
- Vrai si le fichier existe.
- [ -f fichier ]
- Vrai si le fichier existe et est un fichier ordinaire.
- [ -h (ou -L) fichier ]
- Vrai si le fichier existe et est un lien symbolique.
- [ -r fichier ]
- Vrai si le fichier existe et est lisible.
- [ -w fichier ]
- Vrai si le fichier existe et est accessible en écriture.
- [ -x fichier ]
- Vrai si le fichier existe et est exécutable.
- [ -s fichier ]
- Vrai si le fichier existe et a une taille supérieure à zéro.
- [ -z chaîne ]
- Vrai si la longueur de la chaîne est nulle.
- [ -n chaîne ]
- Vrai si la longueur de la string n’est pas nulle.
- [ -S fichier ]
- Vrai si le fichier existe et est une socket.
- [ -t [fd] ]
- Vrai si fd est ouvert sur un terminal. Si fd est omis, la valeur par défaut est 1 (sortie standard).
- [ -u fichier ]
- Vrai si le fichier existe et a son bit Set-UID positionné.
- [ -O fichier ]
- Vrai si le fichier existe et appartient à l’UID effectif de l’appelant.
- [ -G fichier ]
- Vrai si le fichier existe et appartient au GID effectif de l’appelant.
- [ -b fichier ]
- Vrai si le fichier existe et est spécial en mode bloc.
- [ -p fichier ]
- Vrai si le fichier existe et est un tube nommé.
- [ -c fichier ]
- Vrai si le fichier existe et est spécial en mode caractère.
- [ -g fichier ]
- Vrai si le fichier existe et a son bit Set-GID positionné.
- [ -k fichier ]
- Vrai si le fichier existe et a son bit collant (Sticky) positionné.
- [ fichier1 –nt fichier2 ]
- Vrai si fichier1 est plus récent (d’après les dates de modification) que fichier2.
- [ fichier1 –ot fichier2 ]
- Vrai si fichier1 est plus ancien que fichier2
- [ fichier1 -ef fichier2 ]
- Vrai si fichier1 et fichier2 ont les mêmes numéros de périphérique et d’i-noeud.
Test sur les chaînes de caractères
- [ chaîne1 = chaîne2 ]
- Vrai si les deux chaînes sont égales.
- [ chaîne1 != chaîne2 ]
- Vrai si les deux chaînes sont différentes.
Test sur les nombres
[ n1 -eq n2 ]
Vrai si n1 et n2 sont égaux.
[ n1 -ne n2 ]
Vrai si n1 et n2 sont différents.
[ n1 -lt n2 ]
Vrai si n1 est strictement inférieur à n2.
[ n1 -le n2 ]
Vrai si n1 est inférieur ou égal à n2.
[ n1 -gt n2 ]
Vrai si n1 est strictement supérieur à n2.
[ n1 -ge n2 ]
Vrai si n1 est supérieur ou égal à n2.
Test et logique
[ ! expr ]
Vrai si expr est fausse.
[ expr1 –a expr2 ]
Vrai si expr1 et expr2 sont toutes les deux vraies.
[ expr1 –o expr2 ]
Vrai si expr1 ou expr2 est vraie.
Instruction If
L’instruction « if » permet d’effectuer des opérations si une condition est réalisée, elle possède 3 niveaux de complexité.
Niveau 1 :
if CONDITION then instruction(s) fi
Niveau 2 :
if CONDITION then instruction(s) else instruction(s) fi
Niveau 3 :
if CONDITION1 then instruction(s) elif CONDITION2 then instruction(s) elif CONDITION3 ... fi
Exemple :
echo "Aimez-vous les épinards ? (oui/non)"
read rep
if [ "$rep" = "oui" ]
then echo "C'est bien"
elif [ "$rep" = "non" ]
then echo "Pas bien"
else echo "Vous devez répondre par oui ou pas non"
fi
Les regex
Pour utiliser une regex, la notation ce fait de ce type :
if [[ $var =~ regex ]]
Instruction Case
Le « case » fonctionne comme une série de if..elif..elif..elif..elif..else..fi mais apparaît de façon plus claire.
case VARIABLE in cas_1) instruction(s);; cas_2) instruction(s);; cas_3) instruction(s);; *) instruction(s)_sinon;; esac
Exemple (en faisant la même chose que pour l’exemple du « if ») :
echo "Aimez-vous les épinards ? (oui/non)"
read rep
case $rep in
"oui") echo "C'est bien";;
"non") echo "Pas bien";;
*) echo "Il faut répondre oui ou non";;
esac
La boucle For
La boucle « for » s’articule autour de 2 schémas.
Schéma 1 :
for VAR in LISTE #où VAR est une variable et LISTE une liste d'éléments do instruction(s) done
Exemple :
for i in 1 2 3
do
echo "i =" $i
done
Résultat :
i = 1 i = 2 i = 3
Schéma 2 :
for ((initialisation de VAR; contrôle de VAR; modification de VAR)) do instruction(s) done
Ce qui permet par exemple de coder un compte à rebours de 0 à 5:
for ((i=0; i<=5; i++))
do
echo $i
done
Résultat :
0 1 2 3 4 5
La boucle While
La boucle "while" s'articule autour de ce schéma :
while [ CONDITION ]
do
instruction(s)
done
CONDITION est une condition de continuation de la boucle et tant que cette condition est vraie, la boucle continue.
Généralement, il faut définir les variables de CONDITION avant le while, sinon la condition n'est pas vérifiable (vu qu'elle n'est pas définie).
Exemple :
i=0
while [ $i -le 5 ] #ou while ((i<=5))
do
echo $i
((i++))
done
Résultat :
0 1 2 3 4 5
Pour la syntaxe des opérateurs de test et de comparaison numérique dans les crochets (exemple avec -le), reportez-vous plus bas.
La boucle Until
La boucle "until" (même synthaxe que la boucle "while") s'arrête quand CONDITION est vraie, alors que la boucle "while" continue tant que CONDITION est vraie.
Les variables
Déclarer une variable :
[root@test ~]# toto="salut" [root@test ~]# echo $toto salut
Opération mathématique :
let "a = 5" let "b = 3" let "c = a + b"
Les tableaux :
tableau=('valeur0' 'valeur1' 'valeur2')
Pour afficher un élément ou tous :
${tableau[2]} ${tableau[*]}
Pour modifier un élément :
tableau[2]='valeur2'
Pour afficher certains caractères d'une variable :
[root@test ~]# toto="salut" [root@test ~]# echo ${toto:2:4} lut
(Ici du caractère 2 à 4)