Académique Documents
Professionnel Documents
Culture Documents
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
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
Arafet BOUSSAID
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"
echo ${#var}
#remarque : lancez man date pour voire tous les genres de formatage de la date (%D , %d, %F etc.)
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
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" * >
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
>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
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
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).
Arafet BOUSSAID
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
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
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
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
------------------------------------#!/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
-------------------------------------
-a entre -s entre entre1 -nt entre2 entre1 -ot entre2 fich1 -et fich2
-z ch -n ch
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
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
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
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 :
Exemple : programme for_form1 ----------------#!/bin/bash for i do echo $i echo "Passage a l'argument suivant ..." done
----------------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
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
-----------------
done -----------------
Arafet BOUSSAID
14