TP VI : Programmation Shell
Déclaration d’une variable
c=Salut\ les\ Copains # Solution lourde
c="Salut les copains" # Solution correcte
c='Salut les copains' # Solution correcte
echo "c= $c"
echo 'c= $c'
Suppression et protection d’une variable
On supprime une variable avec la commande unset. On peut protéger une variable en écriture
et contre sa suppression avec la commande readonly. Une variable en lecture seule même
vide est figée. Il n'existe aucun moyen de la replacer en écriture et de la supprimer, sauf à
quitter le shell.
$ a=Jules
$ b=Cesar
$ echo $a $b
Jules Cesar
$ unset b
$ echo $a $b
Jules
$ readonly a
$ a=Neron
a: is read only
$ unset a
a: is read only
Exportation d’une variable
Par défaut une variable n'est accessible que depuis le shell où elle a été définie.
$ a=Jules
$ echo 'echo "a=$a"' > voir_a.sh
$ chmod u+x voir_a.sh
$ ./voir_a.sh
a=
La commande export permet d'exporter une variable de manière à ce que son contenu soit
visible par les scripts et autres sous-shells. Les variables exportées peuvent être modifiées
dans le script, mais ces modifications ne s'appliquent qu'au script ou au sous-shell.
$ export a
./voir_a.sh
a=Jules
$ echo 'a=Neron ; echo "a=$a"' >> voir_a.sh
$ ./voir_a.sh
Script Shell -1-
a=Jules
a=Neron
$ echo $a
Jules
Accolades
Les accolades de base « {} » permettent d'identifier le nom d'une variable. Imaginons la
variable fichier contenant le nom de fichier 'liste'. On veut copier liste1 en liste2.
$ fichier=liste
$ cp $fichier2 $fichier1
usage: cp [-fhip] [--] source_file destination_file
or: cp [-fhip] [--] source_file ... destination_directory
or: cp [-fhip] [-R | -r] [--]
[source_file | source_directory] ... destination_directory
Ça ne fonctionne pas car ce n'est pas $fichier qui est interprété mais $fichier1 et $fichier2 qui
n'existent pas.
$ cp ${fichier}2 ${fichier}1
Dans ce cas, cette ligne équivaut à
$ cp liste2 liste1
Les accolades indiquent que fichier est un nom de variable
Variables spéciales
Il s'agit de variables accessibles uniquement en lecture et dont le contenu est généralement
contextuel.
$cat [Link]
#!/usr/bin/sh
echo "Nom : $0"
echo "Nombre de parametres : $#"
echo "Parametres : 1=$1 2=$2 3=$3"
echo "Liste : $*"
echo "Elements : $@"
$ [Link] riri fifi loulou
Nom : ./[Link]
Nombre de parametres : 3
Parametres : 1=riri 2=fifi 3=loulou
Liste : riri fifi loulou
Elements : riri fifi loulou
Redéfinition des paramètres
Script Shell -2-
Outre le fait de lister les variables, la commande set permet de redéfinir le contenu des
variables de position. Avec
set valeur1 valeur2 valeur3 ...
$1 prendra comme contenu valeur1, $2 valeur2 et ainsi de suite.
$ cat [Link]
#!/usr/bin/sh
echo "Avant :"
echo "Nombre de parametres : $#"
echo "Parametres : 1=$1 2=$2 3=$3 4=$4"
echo "Liste : $*"
set alfred oscar romeo zoulou
echo "apres set alfred oscar romeo zoulou"
echo "Nombre de parametres : $#"
echo "Parametres : 1=$1 2=$2 3=$3 4=$4"
echo "Liste : $*"
Réorganisation des paramètres
La commande shift est la dernière commande permettant de modifier la structure des
paramètres de position. Un appel simple décale tous les paramètres d'une position en
supprimant le premier : $2 devient $1, $3 devient $2 et ainsi de suite. Le $1 originel disparaît.
$#, $* et $@ sont redéfinis en conséquence.
La commande shift suivie d'une valeur n effectue un décalage de n éléments. Ainsi avec
shift 4
$5 devient $1, $6 devient $2, ...
$ cat [Link]
#!/usr/bin/sh
set alfred oscar romeo zoulou
echo "set alfred oscar romeo zoulou"
echo "Nombre de parametres : $#"
echo "Parametres : 1=$1 2=$2 3=$3 4=$4"
echo "Liste : $*"
shift
echo "Après un shift"
echo "Nombre de parametres : $#"
echo "Parametres : 1=$1 2=$2 3=$3 4=$4"
echo "Liste : $*"
Sortie de script
Script Shell -3-
La commande exit permet de mettre fin à un script. Par défaut la valeur retournée est 0 (pas
d'erreur) mais n'importe quelle autre valeur de 0 à 255 peut être précisée. On récupère la
valeur de sortie par la variable $?.
$ exit 1
Tests de conditions
La commande test permet d'effectuer des tests de conditions. Le résultat est récupérable par la
variable $? (code retour). Si ce résultat est 0 alors la condition est réalisée.
Tests sur chaîne
test -z "variable" : zero, retour OK si la variable est vide (ex test -z "$a")
test -n "variable" : non zero, retour OK si la variable n'est pas vide (texte
quelconque)
test "variable" = chaîne : OK si les deux chaînes sont identiques
test "variable" != chaîne : OK si les deux chaînes sont différentes
Tests sur valeurs numériques
Les chaînes à comparer sont converties en valeurs numériques. La syntaxe est
test valeur1 option valeur2
et les options sont les suivantes :
Option Rôle
-eq Equal : Egal
-ne Not Equal : Différent
-lt Less than : inférieur
-gt Greater than : supérieur
-le Less ou equal : inférieur ou égal
-ge Greater or equal : supérieur ou égal
$ a=10
$ b=20
$ test "$a" -ne "$b" ; echo $?
0
$ test "$a" -ge "$b" ; echo $?
1
$ test "$a" -lt "$b" && echo "$a est inferieur a $b"
10 est inferieur a 20
Tests sur les fichiers
La syntaxe est
Script Shell -4-
test option nom_fichier
et les options sont les suivantes :
Option Rôle
-f Fichier normal
-d Un répertoire
-c Fichier en mode caractère
-b Fichier en mode bloc
-p Tube nommé (named pipe)
-r Autorisation en lecture
-w Autorisation en écriture
-x Autorisation en exécution
-s Fichier non vide (au moins un caractère)
-e Le fichier existe
-L Le fichier est un lien symbolique
-u Le fichier existe, SUID-Bit positionné
-g Le fichier existe SGID-Bit positionné
$ test -f lien_fic1 ; echo $?
1
$ test -x [Link] ; echo $?
1
$ test -d rep1 ; echo $?
0
Tests combinés par critères ET OU NON
On peut effectuer plusieurs tests avec une seule instruction. Les options de combinaisons sont
les mêmes que pour la commande find.
Critère Action
-a AND, ET logique
-o OR, OU logique
! NOT, NON logique
(...) groupement des combinaisons. Les parenthèses doivent être vérouillées \(...\).
$ test -d "rep1" -a -w "rep1" && echo "rep1: repertoire, droit
en ecriture"
rep1: repertoire, droit en ecriture
Syntaxe allégée
Script Shell -5-
Le mot test peut être remplacé par les crochets ouverts et fermés « [...] ». Il faut respecter un
espace après et avant les crochets.
$ [ "$a" -lt "$b" ] && echo "$a est inferieur a $b"
10 est inferieur a 20
Script Shell -6-