Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
CHAPITRE IV
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
1) Structure et exécution d’un script
Le shell n’est pas qu’un simple interpréteur de commandes, mais dispose d’un
véritable langage de programmation avec notamment une gestion des variables,
des tests et des boucles, des opérations sur les variables, des fonctions...
Par convention les noms des shell scripts se terminent généralement (pas
obligatoirement) par « .sh »
Pour rendre un script exécutable directement :
chmod u+x monscript
Pour l’exécuter :
./monscript
Pour éviter le ./ :
PATH=$PATH:.
monscript
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
1) Structure et exécution d’un script
Une ligne de commentaire commence toujours par le caractère #. Un
commentaire peut être placé en fin d’une ligne comportant déjà des
commandes.
La ligne suivante effectue un ls
ls # La ligne en question
La première ligne a une importance particulière car elle permet de préciser quel
shell va exécuter le script :
#!/bin/bash
#!/bin/ksh
Dans le premier cas c’est un script Bourne Again, dans l’autre un script Korn.
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
2) Arguments d’un script
Paramètres de position
Les paramètres de position sont aussi des variables spéciales utilisées lors d’un
passage de paramètres à un script.
Variable Contenu
$0 Nom de la commande (du script).
$1-9 $1,$2,$3... Les neuf premiers paramètres passés au script.
$# Nombre total de paramètres passés au script.
$* Liste de tous les paramètres au format "$1 $2 $3 . . . " .
$@ Liste des paramètres sous forme d’éléments distincts "$1"
"$2" "$3" . . .
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
2) Arguments d’un script
cat [Link]
#!/bin/bash
echo "Nom : $0"
echo "Nombre de parametres : $#"
echo "Parametres : 1=$1 2=$2 3=$3"
echo "Liste : $*"
echo "Elements : $@"
Exemple d‘execution
./[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
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
2) Arguments d’un script
Redéfinition des paramètres
Outre le fait de lister les variables, l’instruction set permet de redéfinir le
contenu des variables de position.
set valeur1 valeur2 valeur3 ...
$1 prendra comme contenu valeur1, $2 valeur2 et ainsi de suite.
cat [Link]
#!/bin/bash
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 : $*"
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
2) Arguments d’un script
./[Link] riri fifi loulou donald picsou
Avant :
Nombre de parametres : 5
Parametres : 1=riri 2=fifi 3=loulou 4=donald
Liste : riri fifi loulou donald picsou
apres set alfred oscar romeo zoulou
Nombre de parametres : 4
Parametres : 1=alfred 2=oscar 3=romeo 4=zoulou
Liste : alfred oscar romeo zoulou
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
2) Arguments d’un script
Réorganisation des paramètres
La commande shift est la dernière commande permettant de modifier la
structure des paramètres de position.
Un simple appel 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, . ..
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
2) Arguments d’un script
cat [Link]
#!/bin/bash
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 : $*"
./[Link]
set alfred oscar romeo zoulou
Nombre de parametres : 4
Parametres : 1=alfred 2=oscar 3=romeo 4=zoulou
Liste : alfred oscar romeo zoulou
Après un shift
Nombre de parametres : 3
Parametres : 1=oscar 2=romeo 3=zoulou 4=
Liste : oscar romeo zoulou
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
2) Arguments d’un script
Sortie de script
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.
Vous récupérez la valeur de sortie par la variable $?.
exit 1
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
3) Environnement du processus
En principe seules les variables exportées sont accessibles par un processus
fils. Si vous souhaitez visualiser l’environnement lié à un fils (dans un script par
exemple) utilisez la commande env.
env
ESSKEY=/etc/[Link]
NNTPSERVER=news
INFODIR=/usr/local/info:/usr/share/info:/usr/info
MANPATH=/usr/local/man:/usr/share/man
KDE_MULTIHEAD=false
SSH_AGENT_PID=28012
HOSTNAME=slyserver
DM_CONTROL=/var/run/xdmctl
XKEYSYMDB=/usr/share/X11/XKeysymDB
HOST=p64p17bicb3
SHELL=/bin/bash
TERM=xterm
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
3) Environnement du processus
La commande env permet de redéfinir aussi l’environnement du processus à
lancer.
Cela peut être utile lorsque le script doit accéder à une variable qui n’est pas
présente dans l’environnement du père, ou qu’on ne souhaite pas exporter.
cat voir_a.sh
#!/bin/bash
echo "a=$a"
unset a
./voir_a.sh
a=
env a=jojo ./voir_a.sh
a=jojo
echo a=$a
a=
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
3) Environnement du processus
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.
a=Jules
echo ’echo "a=$a"’ > voir_a.sh
chmod u+x voir_a.sh
./voir_a.sh
a=
export a
./voir_a.sh
a=Jules
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
4) Substitution de commande
Le mécanisme de substitution permet de placer le résultat de commandes
simples ou complexes dans une variable. Vous placez les commandes à
exécuter entre des accents graves « ` » ([Alt Gr] 7).
mon_unix=`uname`
echo ${mon_unix}
Linux
machine=`uname -a | cut -d" " -f5`
echo $machine
SMP
Avec les accolades et les parenthèses.
mon_unix=$(uname)
echo ${mon_unix}
Linux
machine=$(uname -a | cut -d" " -f5)
echo $machine
SMP
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
5) 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 une 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.
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
5) Tests de conditions
a=
test -z "$a" ; echo $?
0
test -n "$a" ; echo $?
1
a=Jules
test "$a" = Jules ; echo $?
0
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
5) Tests de conditions
Tests sur les valeurs numériques
Les chaînes à comparer sont converties en valeurs numériques. Bash ne gère
que des valeurs entières. La syntaxe est :
test valeur1 option valeur2
Option Rôle
-eq Equal : égal
-ne Not Equal : différent
-lt Less than : inférieur
-gt Greater than : supérieur
-le Less or equal : inférieur ou égal
-ge Greater or equal : supérieur ou égal
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
5) Tests de conditions
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
commande1 && commande2
commande1 || commande2
La commande située après && sera exécutée uniquement si la commande
précédente a retourné 0 (réussite).
La commande située après || ne sera exécutée que si la commande
précédente a retourné autre chose que 0.
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
5) Tests de conditions
Tests sur les fichiers
La syntaxe est :
test option nom_fichier
Option Rôle
-f Fichier normal.
-d Un répertoire.
-s Fichier non vide (au moins un caractère).
-e Le fichier existe.
-L Le fichier est un lien symbolique .
-x Autorisation en exécution.
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
5) Tests de conditions
ls -l
-rw-r--r-- 1 seb users 1392 Aug 14 15:55 [Link]
lrwxrwxrwx 1 seb users 4 Aug 14 15:21 lien_fic1 -> fic1
lrwxrwxrwx 1 seb users 4 Aug 14 15:21 lien_fic2 -> fic2
-rw-r--r-- 1 seb users 234 Aug 16 12:20 liste1
drwxr-xr-x 2 seb users 8192 Aug 19 12:09 rep1
test -f lien_fic1 ; echo $?
1
test -x [Link] ; echo $?
1
test -d rep1 ; echo $?
0
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
5) Tests de conditions
Tests combinés par des critères ET, OU, NON
Critère Action
-a AND, ET logique
-o OR, OU logique
! NOT, NON logique
test -d "rep1" -a -w "rep1" && echo "rep1: repertoire,
droit en ecriture"
rep1: repertoire, droit en ecriture
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
6) if ... then ... else
La structure if then else fi est une structure de contrôle conditionnelle.
if <commandes_condition>
then
<commandes exécutées si condition réalisée>
else
<commandes exécutées si dernière condition pas réalisée>
fi
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
6) if ... then ... else
cat [Link]
#!/bin/bash
if [ $# -ne 0 ]
then
echo "$# parametres en ligne de commande"
else
echo "Aucun parametre; set alfred oscar romeo zoulou"
set alfred oscar romeo zoulou
fi
echo "Nombre de parametres : $#"
echo "Parametres : 1=$1 2=$2 3=$3 4=$4"
echo "Liste : $*"
./[Link] toto titi
2 parametres en ligne de commande
Nombre de parametres : 2
Parametres : 1=toto 2=titi 3= 4=
Liste : toto titi
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
6) if ... then ... else
./[Link]
Aucun parametre; set alfred oscar romeo zoulou
Nombre de parametres : 4
Parametres : 1=alfred 2=oscar 3=romeo 4=zoulou
Liste : alfred oscar romeo zoulou
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
7) Choix multiples case
La commande case ... esac permet de vérifier le contenu d’une variable ou
d’un résultat de manière multiple.
case Valeur in
Modele1) Commandes ;;
Modele2) Commandes ;;
*) action_defaut ;;
esac
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
7) Choix multiples case
cat [Link]
#!/bin/bash
if [ $# -ne 0 ]
then
echo "$# parametres en ligne de commande"
else
echo "Aucun parametre; set alfred oscar romeo zoulou"
exit 1
fi
case $1 in
a*)
echo "Commence par a" ;;
b*)
echo "Commence par b" ;;
fic[123])
echo "fic1 fic2 ou fic3" ;;
*)
echo "Commence par n’importe" ;;
esac
exit 0
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
7) Choix multiples case
./[Link] "au revoir"
Commence par a
./[Link] bonjour
Commence par b
./[Link] fic2
fic1 ou fic2 ou fic3
./[Link] erreur
Commence par n’importe
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
8) Saisie de l’utilisateur
La commande read permet à l’utilisateur de saisir une chaîne et de la placer
dans une ou plusieurs variable. La saisie est validée par [Entrée].
read var1 [var2 ...]
Si plusieurs variables sont précisées, le premier mot ira dans var1, le second
dans var2, et ainsi de suite.
S’il y a moins de variables que de mots, tous les derniers mots vont dans la
dernière variable.
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
8) Saisie de l’utilisateur
$ cat [Link]
#!/bin/bash
echo –e "Continuer (O/N) ? \c"
read reponse
echo "reponse=$reponse"
case $reponse in
O) echo "Oui, on continue" ;;
N) echo "Non, on s’arrête"
exit 0 ;;
*) echo "Erreur de saisie (O/N)"
exit 1 ;;
esac
echo –e "Pour continuer. Tapez deux mots ou plus :\c"
read mot1 mot2
echo –e "mot1=$mot1\nmot2=$mot2"
exit 0
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
8) Saisie de l’utilisateur
./[Link]
Continuer (O/N) ? O
reponse=O
Oui, on continue
Pour continuer. Tapez deux mots ou plus :salut les amis
mot1=salut
mot2=les amis
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les boucles
Elles permettent la répétition d’un bloc de commandes soit un nombre limité de
fois, soit conditionnellement.
Toutes les commandes à exécuter dans une boucle se placent entre les
commandes do et done.
Boucle for
La boucle for ne se base pas sur une quelconque incrémentation de valeur mais
sur une liste de valeurs, de fichiers ...
for var in liste
do
commandes à exécuter
done
La liste représente un certain nombre d’éléments qui seront successivement
attribués à var.
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les boucles
Avec une variable
cat [Link]
#!/bin/bash
for params in $@
do
echo "$params"
done
./[Link] test1 test2 test3
test1
test2
test3
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les boucles
Avec une liste d’éléments explicite
Chaque élément situé après le « in » sera utilisé pour chaque itération de la
boucle, l’un après l’autre.
cat [Link]
#!/bin/bash
for params in liste liste2 liste3
do
echo $params
done
./[Link]
liste
Liste2
liste3
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les boucles
Avec des critères de recherche sur nom de fichiers.
Si un ou plusieurs éléments de la liste correspond à un fichier ou à un motif de
fichiers présents à la position actuelle de l’arborescence, la boucle for considère
l’élément comme un nom de fichier.
cat [Link]
#!/bin/bash
for params in *
do
echo -e "$params \c"
type_fic=`ls -ld $params | cut -c1`
case $type_fic in
-) echo "Fichier normal" ;;
d) echo "Repertoire" ;;
l) echo "lien symbolique" ;;
*) echo "autre" ;;
esac
done
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les boucles
Avec une substitution de commande
Toute commande produisant une liste de valeurs peut être placée à la suite du
« in » à l’aide d’une substitution de commande. La boucle for prendra le résultat
de cette commande comme liste d’éléments sur laquelle boucler.
cat [Link]
#!/bin/bash
echo "Liste des utilisateurs dans /etc/passwd"
for params in `cat /etc/passwd | cut -d: -f1`
do
echo "$params "
done
./[Link]
liste des utilisateurs dans /etc/passwd
root
nobody
nobodyV
daemon
……
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les boucles
Boucle while
La commande while permet une boucle conditionnelle « tant que ». Tant que la
condition est réalisée, le bloc de commande est exécuté. On sort si la condition
n’est plus valable.
while condition
do
commandes
done
ou :
while
bloc d’instructions formant la condition
do
commandes
done
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les boucles
cat [Link]
#!/bin/bash
while
echo –e "Chaine ? \c"
read nom
test -z "$nom"
do
echo "ERREUR : pas de saisie"
done
echo "Vous avez saisi : $nom"
Lecture d’un fichier ligne à ligne
#!/bin/bash
cat [Link] | while read line
do
echo "$line"
done
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les boucles
Boucle until
La commande until permet une boucle conditionnelle « jusqu’à ». Dès que la
condition est réalisée, on sort de la boucle.
until condition
do
commandes
done
ou :
until
bloc d’instructions formant la condition
do
commandes
done
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les boucles
true et false
La commande true ne fait rien d’autre que de renvoyer 0. La commande
false renvoie toujours 1. De cette manière il est possible de réaliser des
boucles sans fin. La seule manière de sortir de ces boucles est un exit ou un
break.
while true
do
commandes
exit / break
done
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les boucles
break et continue
La commande break permet d’interrompre une boucle. Dans ce cas le script
continue après la commande done. Elle peut prendre un argument numérique
indiquant le nombre de boucles à sauter,
while true
do
echo –e "Chaine ? \c"
read a
if test -z "$a"
then
break
fi
done
La commande continue permet de relancer une boucle et d’effectuer un
nouveau passage. Elle peut prendre un argument numérique indiquant le
nombre de boucles à relancer (on remonte de n boucles). Le script redémarre à
la commande do.
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les boucles
Boucle select
La commande select permet de créer des menus simples, avec sélection par
numéro. La saisie s’effectue au clavier avec le prompt de la variable PS3. Si la
valeur saisie est incorrecte, une boucle s’effectue et le menu s’affiche à
nouveau. Pour sortir d’un select il faut utiliser un break.
select variable in liste_contenu
do
traitement
done
Si in liste_contenu n’est pas précisé, ce sont les paramètres de position qui sont
utilisés et affichés.
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les boucles
#!/bin/bash
PS3="Votre choix :"
echo "Quelle donnee ?"
select reponse in Jules Romain Francois quitte
do
if test "$reponse" = "quitte"
then
break
fi
echo "Vous avez choisi $reponse"
done
echo "Au revoir."
exit 0
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
9) Les fonctions
Les fonctions sont des bouts de scripts nommés, directement appelés par leur
nom, pouvant accepter des paramètres et retourner des valeurs. Les noms de
fonctions suivent les mêmes règles que les variables sauf qu’elles ne peuvent
pas être exportées.
nom_fonction ()
{
commandes
return
}
cat fonction
l_l ()
{
ls -l $@
}
l_i ()
{
ls -i $@
}
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
10) Calculs et expressions
expr
La commande expr permet d’effectuer des calculs sur des valeurs numériques,
des comparaisons
Opérateur Rôle
+ Addition.
- Soustraction.
* Multiplication. L’étoile étant reconnue par le shell comme un
wildcard, il faut la verrouiller avec un antislash : \ * .
/ Division.
% Modulo.
!= Différent. Affiche 1 si différent, 0 sinon.
= Égal. Affiche 1 si égal, 0 sinon.
< Inférieur. Affiche 1 si inférieur, 0 sinon.
> Supérieur. Affiche 1 si supérieur, 0 sinon.
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
10) Calculs et expressions
expr 7 + 3
10
expr 7 \* 3
21
a=$(expr 13 - 10)
echo $a
3
cat [Link]
#!/bin/bash
cumul=0
compteur=0
nb_boucles=10
while test "$compteur" -le "$nb_boucles"
do
cumul=$(expr $cumul + $compteur)
echo "cumul=$cumul, boucle=$compteur"
compteur=$(expr $compteur + 1)
done
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
10) Calculs et expressions
./[Link]
cumul=0, boucle=0
cumul=1, boucle=1
cumul=3, boucle=2
cumul=6, boucle=3
cumul=10, boucle=4
cumul=15, boucle=5
cumul=21, boucle=6
cumul=28, boucle=7
cumul=36, boucle=8
cumul=45, boucle=9
cumul=55, boucle=10
Linux
I. II. III. IV. V. VI. VII. VIII. IX.
Programmation shell
10) Calculs et expressions
Calculs avec bash
Le bash propose une forme simple de calculs sur les entiers, en plaçant
l’opération entre $ ( ( . . . ) ) :
a=1
a=$((a+1))
echo $a
2
b=2
a=$((a*b))
echo $a
4
Vous n’avez pas besoin de spécifier les $ des noms des variables entre les
doubles parenthèses.
let moyenne=$moyenne+$note