8/8/2019 CHAP4 Script Shell
1/28
La programmation Shell
Ecole Nationale des sciences delinformatique
8/8/2019 CHAP4 Script Shell
2/28
2
Introduction: Environnement Shell
Les variables locales / denvironnement: Les commandes: set, unset, declare, export, env
Les fichiers de configuration: Dcrire lenvironnement de lutilisateur. Il y a deux types de fichiers de configuration (scripts):
- Ceux qui sont lus au moment de connexion;- Le fichier: //etcetc/profile/profile (commun tous les utilisateurs):
#cat /etc/profile
USER=`id -un`LOGNAME=$USERMAIL="/var/spool/mail/$USER"HOSTNAME=`/bin/hostname`for i in /etc/profile.d/*.sh
if [ -r "$i" ]; then. $i
fidone.
8/8/2019 CHAP4 Script Shell
3/28
3
Introduction: Environnement Shell
Les fichiers de configuration: Dcrire lenvironnement de lutilisateur. Il y a deux types de fichiers de configuration (scripts):
- Ceux qui sont lus au moment de connexion;- Le fichier: ~/.bash_profile ou ~/.bash_login ou ~/.profile
(spcifiques chaque utilisateur)#cat ~/.bash_profile
PATH=$PATH:$HOME/bin:.
- Ceux qui sont lus chaque lancement de shell (bash).- Le fichier: /etc/bashrc (commun tous les utilisateurs).
#cat /etc/bashrc
umask 022
- Le fichier: ~/.bashrc (spcifique chaque utilisateur)#cat /etc/bashrc
alias rm='rm i'
8/8/2019 CHAP4 Script Shell
4/28
4
Remarques
La famille profile: lanc au moment du connexion delutilisateur.- bash VS bash -login (force la lecture des fichiers de
login de la famille profile)
La famille bashrc: excut chaque fois quun Shell(bash) est lanc.
Le fichier/etc/bash_logout- sil est prsent - excut la fin de la session bash de tous les utilisateurs.
Le fichier ~/.bash_logout sera excut la fin de lasession bash spcifique un utilisateur.
8/8/2019 CHAP4 Script Shell
5/28
5
Les scripts
Dfinition: Un script shell est une liste dinstructions contenues
dans un fichier (texte).
#! /bin/bash
#un premier script shell
echo " script shell"
Pour excuter les instructions, (./mon_script) deuxconditions doivent tre remplies:
La premire ligne doit contenir (La ligne shebang (#!)):#! /bin/bash [-vx] (pour un script shell utilisant bash)
Le fichier soit tre excutable et lisible. (chmod +rxnom_script)
Si ces 2 conditions ne sont pas remplies, on peut forcerlexcution du script: #bash nom_script
8/8/2019 CHAP4 Script Shell
6/28
6
Les scripts: Passage de paramtres
Les variables passes au script sur la ligne decommande (les arguments) sont accessible par:
$1: le premier argument, $2: le deuxime argument
Remarque:Remarque:- $0 le nom du script,
- $* liste des paramtres (sans le $0),
- $# le nombre de paramtres,
- $$ numero du processus en cours dexcution,- $? La valeur de retour de la dernire commande,
- Avec la commande shift, on peut dcaler le arguments:$1 passe dans $2, $3 passe dans $2,
8/8/2019 CHAP4 Script Shell
7/28
7
Les scripts: les expressions
logiques
Les expressions logiques sont values a laide de la
commande test expression_logique (quivalent [ESPACEexpression_logiqueESPACE]). Le rsultat de lvaluation de lexpression logique est renvoy
dans le code de retour de la commande: Si la commande renvoie un code de retour 0,
lexpression logique est vrai. Une valeur diffrent de 0,
lexpression logique est faux.
Les expressions logiques peuvent tre combines par desoperateurs logiques:
-a: le ET logique. Exemple: #test cond1 a cond2 -a cond3 -o: le OU logique.
Exemple #[ cond1 o cond2 -o !cond3 ]- ! La ngation de lexpression logique.
8/8/2019 CHAP4 Script Shell
8/28
8
La commande test: Les expressions
logiques sur les fichiers
Les expressions logiques:
Les options de la commande test pour letraitement des fichiers:
Evaluer le type du fichier: -ffichier: vrifier que le fichier existe et que cest un
fichier ordinaire.Exemple:Exemple: [ -f /etc/fstab ]; echo $?; VS test f /dev/hda; echo $?;
-d fichier : vrifier que le fichier existe et que cest unrpertoire.
-b fichier : vrifier que le fichier existe et que cest unfichier de type bloc.
-c fichier: vrifier que le fichier existe et que cest unfichier de type caractre. -L fichier: vrifier que le fichier existe et que cest un
lien symbolique. -e fichier : vrifier que le fichier existe indpendamment
de son type.
8/8/2019 CHAP4 Script Shell
9/28
9
La commande test: Les expressions
logiques sur les fichiers
Les expressions logiques:
Evaluer les droits daccs dun fichier: -r fichier, -w fichier, -x fichier : vrifier que le fichier
existe et lisible (-r), inscriptible (-w), excutable (-x).
-u fichier, -g fichier, -k fichier : vrifier que le fichier
existe et le bit SUID (-u), le bit SGID (-g), le Sticky bit(-k) est positionn.
Exemple: [ -k /tmp ]; echo $? ;
Autres options:
file1 effile2 : vrifier que file1 et file2 sont sur lemme systme de fichier et ont le mme numrodinode.
file1 nt file2: vrifier que file1 est modifi aprs file2.
8/8/2019 CHAP4 Script Shell
10/28
10
La commande test: Les expressions
logiques sur les chaines de caractres
Les expressions logiques: Les options de la commande test pour letraitement des chaines des caractres:
-n string: vrifier que la longueur de la chaine decaractres est non nulle.
-z string : vrifier que la longueur de la chaine decaractres est nulle.
[ -z "$var" ] quivalent [ ! n "$var" ]
string1 = string2: vrifier que les deux chaines
(string1 et string2) sont gales. string1 != string2: vrifier que les deux chaines
(string1 et string2) sont differentes.
[ ! "$var1" = "$var2" ] quivalent [ "$var1" != "$var2" ]
8/8/2019 CHAP4 Script Shell
11/28
11
La commande test: Les expressions
logiques sur les entiers
Les expressions logiques:
Les options de la commande test pour le traitementdes entiers:
integer1 -eq integer2: vrifier que integer1 gale integer2.
integer1 -ne integer2: quivalent :! integer1 -eq integer2
integer1 -gt integer2: vrifier que integer1 est suprieur integer2.
integer1 -ge integer2: vrifier que integer1 est suprieurou gale integer2.
integer1 -lt integer2: quivalent :! integer1 -ge integer2
integer1 -le integer2: quivalent :! integer1 -gt integer2
8/8/2019 CHAP4 Script Shell
12/28
12
Les scripts: les calculs
Comparaison des nombres: avec la commande test :
Options: -eq, -ne, -gt, -ge, -lt, -le.Exemple: [ $# -eq 0 ]
Les calculs de base son effectu avec la commande
expr : Syntaxe: expr int1 operateur int2
ou $(( int1 operateur int2 ))
Affiche le rsultat sur la sortie standard.
Les operateurs: +, -, / et \* ou '*Remarque:Remarque: expr 1 * 2;
interprt par: expr 1 f1 f2 f3 rep 2 (erreur de syntaxe)
8/8/2019 CHAP4 Script Shell
13/28
13
Les scripts: La structure
conditionnelle if
La structure conditionnelle if:
Tester & brancher Syntaxe:
ifcommande#Vrai, si le code de retour de la commande est nul.
thencommande1commande2
else
commande1commande2.
fi
La partie else est optionnel
8/8/2019 CHAP4 Script Shell
14/28
14
Les scripts: La structure
conditionnelle if
Exemple:Exemple1if [ -e /etc/passwd ]then
echo "le fichier /etc/passwd existe"fi
Exemple2- Ecrire un script shell:
renomer.sh fichier1 prefix entierQui permet de renommer un fichier ordinaire existant fichier1en prefixentier (le 3me argument doit tre un entier).
#! /bin/bashif expr $3 + 1 >/dev/null 2>&1 &&[ -f $1 ]Then
mv -f $1 $2$3fi
8/8/2019 CHAP4 Script Shell
15/28
15
Les scripts: La structure
conditionnelle case
La structure conditionnelle case permet dechoisir des commandes diffrentes suivantles diffrents valeur dune variable.
Syntaxe:
case variable in
valeur1) commande1 ;;
valeur2) commande2 ;;
esac
8/8/2019 CHAP4 Script Shell
16/28
16
Les scripts: La structure
conditionnelle case
Exemple: Ecrire un script shell: progprog arg1 [arg2]arg1 [arg2]
prog arg1
- affiche les caractristiques du
rpertoire/fichier arg1 (sil existe).prog arg1(fichier ordinaire) arg2(rpertoire)
- copy arg1 vers arg2.
- si le nombre des arguments estsuprieur 2, le programme doit afficherun message derreur sur la sortiestandard derreur.
8/8/2019 CHAP4 Script Shell
17/28
17
Les scripts: La structure
conditionnelle case
#! /bin/bash
case $# in1) echo "1 arg";if [ -e $1 ];then ls -l $1;fi;;2) echo "2 args";
if [ -f $1 -a -d $2 ]thenecho "copy $1 vers $2"cp $1 $2elseecho "erreur paramtres"fi;;
*) echo 'paramtres suprieur 2' > &2 ;;esac
8/8/2019 CHAP4 Script Shell
18/28
18
Les scripts: La boucle for
La boucle for permet de rpter un traitement unnombre de fois connu.
Syntaxe:
for variable in liste
do
commande1
commande2
done
8/8/2019 CHAP4 Script Shell
19/28
19
Les scripts: La boucle for
Exemple:
Exemple1:for comp in 1 2 3 4 5do
echo "$comp"doneExemple2:for var in $*do
cat $var >>/tmp/filedoneExemple3:for fich in *.tmpdo
mv f $fich /tmp 2>/dev/nulldone
Exemple3:for var in `cat f1`do
echo "$var"done
8/8/2019 CHAP4 Script Shell
20/28
20
Les scripts: La boucle While
La boucle while permet de rpter un traitement tant
quune /plusieurs condition(s) est/sont vrifie(s). Syntaxe:
while commande
# la condition est vrai si commande retourne un codede retour nul
docommande1commande2done
cmd_1&&&&cmd_n
cmd_1||||cmd_n
8/8/2019 CHAP4 Script Shell
21/28
21
Les scripts: La boucle While
Exemple:
Ecrire un scripte shell en utilisant la boucle while:copy.sh rep fich1 fich2 fichn
Qui permet de copier fich1 fich2 fichn sur rep.
#! /bin/bashrep=$1
if [ ! -d $rep ]; then mkdir $rep 2>/dev/null;fi
while shift
doif [ -f $1];then cp $1 $rep 2>/dev/null;fi
done
8/8/2019 CHAP4 Script Shell
22/28
22
Passage de Paramtres un script
La lecture dune valeur peut se faire:1- passage de paramtre sur la ligne decommande ($1, $2, )
2- en lisant lentre standard (le clavier par
dfaut) avec la commande read.
Exemple:
#! /bin/bash
echo " entrer un nom"read nom
echo $nom
8/8/2019 CHAP4 Script Shell
23/28
23
Exemples:
Exemple1: Comment lire un fichier mot par mot?
Exemple2: Comment lire un fichier ligne par ligne?
cat nom_fichier | while read lignedo
echo $ligne
done
for mot in $(cat nom_fichier)
do
echo $mot
done
while read lignedo
echo $ligne
done < nom_fichier
8/8/2019 CHAP4 Script Shell
24/28
24
Exemple:
Ecrire un script Shell (sans utiliser grep):
recherche.sh mot file
qui renvoie un code de retour 0 si le mot existe dansle fichier file et 1 si non.
#! /bin/bashfor m in `cat $2`
do
if [ "$m" = "$1" ]
then
exit 0fi
done
exit 1
8/8/2019 CHAP4 Script Shell
25/28
25
Exemple:
Ecrire un script shell qui obligelutilisateur tapez la lettre y ou Y.
#! /bin/bash
while read xdo
if [ "$x" = "Y" -o "$x" = "y" ]
then
breakfi
done
8/8/2019 CHAP4 Script Shell
26/28
26
Exemple: Les fonctions
DDfinition de fonctions:finition de fonctions: Syntaxe:
function nom_fonction {
# traitements
return valeur_numrique}
ou:ou:nom_fonction () {
}
Accs aux paramtres par $1
Retour de rsultat: ($?).
8/8/2019 CHAP4 Script Shell
27/28
27
Remarques: Les fonctions
# declare f: Afficher les noms des fonctionsdclares
# declare F: Afficher les noms + les corps desfonctions dclares
#unset f nom_fonction: Supprimer la fonctionnom_fonction
#export f nom_fonction: Supprimer la fonctionnom_fonction
#export f: Afficher les fonctions exportes. #local var=val: Dfinir une variable local une
fonction.
8/8/2019 CHAP4 Script Shell
28/28
28
Exemple: Les fonctions
Utilisation des fonctions:Utilisation des fonctions: Exemple:
Ecrire une fonction somme qui retourne lasomme de ses arguments.
#! /bin/bash
function somme {
som=0
for i in $*
do
som=$(($som+$i))
donereturn $som
}
somme 1 2 3 4
echo $?