Vous êtes sur la page 1sur 14

Admin systme LINUX : Support de programmation Shell

Programmation Shell script

Introduction la programmation shell


Un script bash est en gnral une suite de commandes Linux, excutables ds l'invocation de son nom. Mais en plus, il s'agit d'un langage de programmation interprt et complet, comprenant notamment

la gestion des entres-sorties et de leur redirection des variables dfinies par le programmeur et des variables systmes le passage de paramtres des structures conditionnelles et itratives des fonctions internes

Saisie du script

utiliser vi de prfrence mc qui ne traite pas les accents Les lignes commenant par le caractre dise # sont des commentaires. En insrer abondamment ! Un script est un fichier de type texte regroupant des commandes shell et excutable par l'interprteur (un shell), par exemple le programme /bin/bash. Pour spcifier cela, la premire ligne doit tre comme suit: o #! /bin/sh -> on veut que sh interprte le script o #! /bin/ksh -> on veut que ksh interprte le script o #! /bin/csh -> on veut que csh interprte le script o #! /bin/bash -> on veut que bash interprte le script

Excution du script

Elle s'effectue par la commande bash nom-script ou sh nom-script La commande $ ./bonjour, lance l'excution de faon gnrale, si le rpertoire courant contenant bonjour n'est pas list dans le PATH Pour que le script soit excutable, il convient de lui accorder la permission x pour tous ses utilisateurs avec chmod :
chmod a+x bonjour

Si les scripts sont systmatiquement stocks dans un rpertoire prcis, par exemple /home/toto/bin, on peut ajouter ce chemin dans le PATH personnel de toto. Pour cela, il suffit d'ajouter la ligne suivante dans /home/toto/.bash_profile, dont le rle est d'affiner le profil personnel du shell de chaque utilisateur.
# bash_profile ..................... #user specific environment and statup programs PATH=$PATH:$HOME/bin

Arafet BOUSSAID

Admin systme LINUX : Support de programmation Shell

Entres-sorties
Ce sont les voies de communication entre le programme bash et la console :

echo, affiche son argument texte entre guillemets sur la sortie standard, c--d l'cran.
La validation d'une commande echo provoque un saut de ligne.
echo "Bonjour tous !"

read, permet l'affectation directe par lecture de la valeur, saisie sur l'entre standard au
clavier
read var1 var2 ... attend la saisie au clavier d'une liste de valeurs pour les affecter, aprs la validation globale, respectivement aux variables var1, var2 .. Exemple 1 : Ecrire un script appel script2 qui demande votre nom et prnom et affiche bonjour Mr votre_nom votre_prenom. Solution : #! /bin/bash echo read echo read "Tapez votre nom : " nom "Tapez votre prnom : " prenom

echo "Bonjour Mr. $nom $prenom "

Variables prdfinies spciales pour le passage de paramtres :


Elles sont gres par le systme et s'avrent trs utiles dans les scripts. Bien entendu, elles ne sont accessibles qu'en lecture. Ces variables sont automatiquement affectes lors d'un appel de script suivi d'une liste de paramtres. Leurs valeurs sont rcuprables dans $1, $2 ...$9 $? $0 $1 $9 $# $* $$ $! C'est la valeur de sortie de la dernire commande. Elle vaut 0 si la commande s'est droule sans problme. Cette variable contient le nom du script Les (ventuels) premiers arguments passs l'appel du script Le nombre d'arguments passs au script La liste des arguments partir de $1 le n PID du processus courant le n PID du processus fils

Arafet BOUSSAID

Admin systme LINUX : Support de programmation Shell

Exemple :
$ cmd a 1 fich -2 t3 $# $0 $1 $* (cmd un script Shell quelconque) => 5 => cmd => a, $2 = 1, $3 = fich, $4 = -2, $5 = t3 => a 1 fich -2 t3

Exemple2 : essayez ce script : #! /bin/bash echo echo echo echo "mon script est $0" "il ya eu $# paramtres en entre" "le premier paramtre est $1" "le deuxime paramtre est $2"

lancez le script avec des paramtres : ./exemple2 s -a

Manipulation des variables Accs la valeur : $NomVar


remarque : Si ambigut utiliser {} Exemples3 :
var=esprit echo echo echo echo echo $var $varShell $var_Shell ${var}Shell $var-Shell # variable varShell non dfinie # variable var_Shell non dfinie # espritShell # esprit-Shell # longueur de la valeur de var

echo ${#var}

Rcuprer le rsultat dune commande


Pour rcuprer le rsultat dune commande et lenregistrer dans une variable pour une ultrieure utilisation on utilise la syntaxe suivante :
Nom_variable=$(commande)

Exemple1 : mois=$(date +%D)


Arafet BOUSSAID

#remarque : lancez man date pour voire tous les genres de formatage de la date (%D , %d, %F etc.)

Admin systme LINUX : Support de programmation Shell


echo $moi

Exercice :
1. Ecrire un script qui affiche la date et le rpertoire courant de travail 2. Ecrire un script qui affiche la liste et le nombre de ces arguments

Expressions arithmtiques
Exemple4 : pour affecter une valeur une variable (deux mthodes): x=5 ((y = (2 * $x) +3)) echo $y Affecte y la valeur de l'expression 2x+3 ou : y=$(($x+1)) echo $y

les Oprateurs :
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) a++ a-post-incrmentation, post-dcrmentation

++a --a pr-incrmentation, pr-dcrmentation -a +a !a a**b moins unaire, plus unaire ngation logique
b

exponentiation : a

a*b a/b a%b multiplication, division entire, reste a+b a-b addition, soustraction

a<b a<=b a>b a>=b comparaisons a==b a!=b a&&b a||b galit, diffrence ET logique OU logique

a?b:c oprateur conditionnel : Le fonctionnement de cet oprateur ternaire est le suivant : expr_arith1 est value, si sa valeur est vraie la valeur de l'expression arithmtique est celle de expr_arith2, sinon c'est celle de expr_arith3 exemple : (( b = a < 3 ? 5 : 54 )). a=b a*=b a%=b a+=b a-=b oprateurs d'affectation a,b oprateur virgule
4

Arafet BOUSSAID

Admin systme LINUX : Support de programmation Shell

Chaines de caractres
>Protection ou dsactivation des caractrse spciaux
Protection d'un caractre l'aide du caractre \ Ce caractre protge le caractre qui suit immdiatement le caractre \. Exemple :
echo N\noblie pas => Noblie pas echo N'oublie pas => erreur

Exemple 2 :
x=5 echo $x => 5 echo \$x => $x

Exemple 3 :
echo abc => abc echo \abc\ => abc

Protection de caractres l'aide d'une paire de guillemets "chane" Tous les caractres de chane sauf $ \ ` " sont protgs de l'interprtation du shell. Cela signifie, par exemple, qu lintrieur dune paire de guillemets le caractre $ sera quand mme interprt comme une substitution. Ex :
echo "< * $PWD * >" => < * /home/arafet * > echo "< * \"$PWD\" * > " => < * "/home/arafet" * >

Protection totale 'chane'


Arafet BOUSSAID

Admin systme LINUX : Support de programmation Shell

Entre une paire dapostrophes (), aucun caractre de chane (sauf le caractre ') n'est interprt. Ex :
echo '< * $PWD * >' => < * $PWD * >

>Extraction
Longueur d'une chane de caractres Syntaxe : ${#paramtre} Cette syntaxe est remplace par la longueur de la chane de caractres contenue dans paramtre. Ce dernier peut tre une variable, un paramtre spcial ou un paramtre de position. Ex :
echo $PWD /home/arafet echo ${#PWD} 12 => longueur de la chane /home/arafet

Extraction de sous-chanes ${paramtre:ind} : extrait de la valeur de paramtre la sous - chane dbutant l'indice ind. La valeur de paramtre nest pas modifie. Attention : l'indice du premier caractre d'une chane est 0 Ex : ch="abcdefghijk"
echo ${ch:3} => defghijk

${paramtre:ind:nb} : extrait nb caractres partir de l'indice ind Ex :


echo ${ch:8:2} => ij

>Remplacement
Remplacement de la premire occurrence Ex :
v=totito echo ${v/to/ma} => matito

La valeur de la variable v (totito) contient deux occurrences du modle to. Seule la premire occurrence est remplace par la chane ma. Remplacement de la plus longue sous-chane
Arafet BOUSSAID

Admin systme LINUX : Support de programmation Shell

Ex :
v=abcfefg v1=${v/b*f/toto} => utilisation du caractre gnrique * echo $v1 atotog

Deux sous-chanes de v satisfont le modle b*f : bcf et bcfef Cest la plus longue qui est remplace par toto.

>Suppression
Suppression de la plus courte sous-chane gauche Syntaxe : ${paramtre#modle} Ex : x= "12a34a"
echo ${x#*a} 34a => suppression de la sous-chane 12a

Suppression de la plus longue sous-chane gauche Syntaxe : ${paramtre##modle} Ex :


x= 12a34ab echo ${x##*a} b

Suppression de la plus courte sous-chane droite Syntaxe : ${paramtre%modle} Ex:


echo $PWD /home/arafet echo ${PWD%/*} /home

Exercice1 : a) Ecrire un programme calibre prenant deux arguments, une chane de caractres ch et un nombre nb, qui affiche les nb premiers caractres de ch. Aucune erreur ne doit tre traite. b) Modifier le programme prcdent, soit calibre1, pour quil vrifie que : - le nombre darguments est correct - le deuxime argument est un nombre (suite non vide de chiffres).

Exercice2 : En utilisant les modificateurs de chanes,

Arafet BOUSSAID

Admin systme LINUX : Support de programmation Shell

a) crire un programme shell basenom ayant un fonctionnement similaire la commande unix basename. Cette commande affiche le dernier lment dun chemin pass en argument. Il n'est pas ncessaire que ce chemin existe rellement. Ex : $ basename /toto/tata/tutu
tutu

Divers
la commande set set variables : initialisation dune variable liste de tous les paramtres du systme positionne
les paramtres $i (set a b c : positionne $1 = a , $2 = b et $3 = c )

La commande seq
la commande seq permet de sortir une squence de nombres, avec un intervalle ventuel seq [debut] [increment] fin Ex1 seq 4 1 2 3 4 Ex2 seq -2 3 -2 -1 0 1 2 3 Ex3 seq 0 2 10 0 2 4 6 8 10

Le Paramtre spcial ?
Le paramtre spcial ? ( ne pas confondre avec le caractre gnrique ?) contient le code de retour de la dernire commande excute de manire squentielle (excution synchrone). Ex1
pwd /home/sanchis echo $? 0 -------------------------------la commande pwd s'est excute correctement

Ex2
ls -l vi ls: vi: Aucun fichier ou rpertoire de ce type echo $? 2 -------------------------------une erreur sest produite !

code de retour = 0 si vrai code de retour !0 si faux Chaque commande positionne sa manire les codes de retour diffrents de 0. Ainsi, un code de retour gal 1 positionn par la commande unix ls n'a pas la mme signification qu'un
Arafet BOUSSAID

Admin systme LINUX : Support de programmation Shell

code de retour 1 positionn par la commande unix grep. Les valeurs et significations du code de retour dune commande unix ou du shell sont documentes dans les pages correspondantes du manuel (ex : man grep). Lorsque une commande est excute en arrire-plan (excution asynchrone), son code de retour n'est pas mmoris dans le paramtre spcial ?.

Structures de contrle
Choix if
La commande interne if implante le choix alternatif. Syntaxe : if suite_de_commandes1 then suite_de_commandes2 elif suite_de_commandes then suite_de_commandes else suite_de_commandes fi Le fonctionnement est le suivant : suite_de_commandes1 est excute ; si son code de retour est gal 0, alors suite_de_commandes2 est excute sinon c'est la branche elif ou la branche else qui est excute, si elle existe.
Exemple :

programme rm1 ------------------------------------#!/bin/bash if rm $1 2>/dev/null then echo $1 a ete supprime else echo $1 n\'a pas ete supprime ou n\existe pas fi

-------------------------------------

Remarque : Je n'arrive pas mettre une condition dans le if Vrifiez bien qu'il y a des espaces autour des crochets. Exemples :

fichiers :
9

Arafet BOUSSAID

Admin systme LINUX : Support de programmation Shell

if [ -f fich ] # si le fichier fich existe et n'est pas un rpertoire if [ -d fich ] # si le fichier fich existe et c'est un rpertoire chanes : o if [ $word = "coucou" ] o if [ $var != "chane" ] o if [ $var ] # si la variable var n'est pas la chane vide nombres : o if [ $# -eq 3 ] # EQual. Si le nombre de paramtres est 3 o if [ $1 -ne 1 ] # NotEqual. Si le premier paramtre est numriquement 1 o if [ $chiffre -gt 4 ] # GreaterThan. Si $chiffre est numriquement suprieur 4 o if [ $chiffre -ge 5 ] # GreaterorEqual o if [ $chiffre -lt 5 ] # LessThan o if [ $chiffre -le 5 ] # LessorEqual
o o

Commande compose [[
Syntaxe : [[ expr_cond ]] Le fonctionnement de cette commande interne est le suivant : lexpression conditionnelle expr_cond est value : - si sa valeur est Vrai, alors le code de retour de la commande interne [[ est gal 0. - Si sa valeur est Faux, le code de retour est gal 1. - Si expr_cond est mal forme ou si les caractres crochets ne sont pas colls, une valeur diffrente est retourne. Les deux caractres crochets doivent tre colls et un caractre sparateur doit tre prsent de part et dautre de expr_cond. Les mots [[ et ]] sont des mots-cl. La commande interne [[ offre de nombreuses expressions conditionnelles ; cest pourquoi, seules les principales formes de expr_cond seront prsentes, regroupes par catgories.

Permissions : -r fichier => vraie si entre existe et est accessible en lecture par le processus courant. -w fichier => vraie si entre existe et est accessible en criture par le processus courant. -x fichier => vraie si le fichier entre existe et est excutable par le processus courant ou si le rpertoire entre existe et le processus courant possde la permission de passage.
Exemple : echo coucou > toto chmod 200 toto ls -l toto --w------- 1 sanchis sanchis 7 dc 17 17:21 toto le script : [[ -r toto ]] echo $?
Arafet BOUSSAID

10

Admin systme LINUX : Support de programmation Shell

Types d'une entre : -f fichier => vraie si fichier existe et est un fichier ordinaire -d fichier => vraie si fichier existe et est un rpertoire -L fichier => vraie si fichier existe et est un lien symbolique

Exemple : programme affic

------------------------------------#!/bin/bash if [[ -f $1 ]] then echo $1 : fichier ordinaire cat $1 elif [[ -d $1 ]] then echo $1 : repertoire ls $1 else echo $1 : type non traite fi

-------------------------------------

Renseignements divers sur une entre :


vraie si entre existe vraie si entre existe et sa taille est diffrente de zro vraie si entre1 existe et sa date de modification est plus rcente que celle de entre2 vraie si entre1 existe et est plus ancienne que celle de entre2 vrai si fich1 est un lien vers fich2

-a entre -s entre entre1 -nt entre2 entre1 -ot entre2 fich1 -et fich2

Longueur dune chane de caractres :


vraie si la longueur de la chane ch est gale zro vraie si la longueur de la chane ch est diffrente de zro

-z ch -n ch

Comparaisons de chanes de caractres :


vraie si ch1 prcde ch2 vraie si ch1 suit ch2 Lordre des chanes ch1 et ch2 est command par la valeur des paramtres rgionaux. vraie si la chane ch correspond au modle mod vraie si la chane ch ne correspond pas au modle mod mod est un modle de chanes pouvant contenir caractres et expressions gnriques.

ch1 < ch2 ch1 > ch2 ch == mod ch != mod

Si l'on souhaite dsigner une classe de caractres tels que les minuscules ou les majuscules, il est prfrable d'utiliser la syntaxe POSIX 1003.2 correspondante. Ce standard dfinit des classes de caractres sous la forme [:nom_classe:] Des exemples de classes de caractres dfinies dans ce standard sont : [:upper:] (majuscules) [:lower:] (minuscules) [:digit:] (chiffres, 0 9) [:alnum:] (caractres alphanumriques).

Arafet BOUSSAID

11

Admin systme LINUX : Support de programmation Shell

Exercice : crire un script qui vrifie les droits dun fichier donn en paramtre et - affiche lecture et criture si le fichier si le fichier est accessible en mode rw - affiche lecture seul si le fichier si le fichier est accessible en mode r- affiche criture si le fichier si le fichier est accessible en mode w

Choix multiple case


Syntaxe :

case ... in ... esac

case valeur in
val11|val12||val1x) liste_commandes1;; val21|val22||val1y) liste_commandes2;; ... valn1|valn2||val1z) liste_commandesn;;

*) liste_commandes ;; esac
liste_commandesi excute si valeur est de la forme de l'une des valij Le caractre * couvre toute valeur
Exemple : programme shell oui affichant OUI si lutilisateur a saisi le

caractre o ou O
---------------------------------------------------------------#!/bin/bash read -p Entrez votre rponse : rep case $rep in o|O ) echo OUI ;; *) echo Indefini ;; esac ----------------------------------------------------------------

Exercice : crire un script shell case1 prenant un caractre en argument et qui affiche ce caractre si il est un chiffre, une lettre ou un caractre spcial.

Arafet BOUSSAID

12

Admin systme LINUX : Support de programmation Shell

Itration for
L'itration for possde plusieurs syntaxes dont les deux plus gnrales sont : Premire forme : for var do suite_de_commandes done
Lorsque cette syntaxe est utilise, la variable var prend successivement la valeur de chaque paramtre de position initialis.

Deuxime forme :

for var in liste_mots


do suite_de_commandes done
La variable var prend successivement la valeur de chaque mot de liste_mots.

Exemple : programme for_form1 ----------------#!/bin/bash for i do echo $i echo "Passage a l'argument suivant ..." done

programme for_form2 ----------------#!/bin/bash i=0

for x in un deux trois quatre do


(( i++ )) echo $i-$x

----------------lancer : ./for_arg 1 3 8 2

done -----------------

Exercice : Ecrire un programme shell lsrep ne prenant aucun argument, qui demande l'utilisateur de saisir un nom de rpertoire et qui affiche des infos sur son contenu (nombre de fichiers, de rpertoires et de liens).

Arafet BOUSSAID

13

Admin systme LINUX : Support de programmation Shell

Itration while
La commande interne while correspond litration tant que prsente dans de nombreux langages de programmation. Syntaxe : while suite_cmd1 do suite_cmd2 done

Exemple : programme while1 ----------------#!/bin/bash i=0 while (( i < 10 )) do (( i++ )) echo "incrmentation $i" done

programme while1 ----------------#!/bin/bash

cat /etc/passwd | while read line do


echo ---------------------- echo $line

-----------------

done -----------------

Arafet BOUSSAID

14

Vous aimerez peut-être aussi