Bash et shell scripts

Transcription

Bash et shell scripts
2007
Administration système et réseaux
1
Bash et shell scripts Sous Unix, un interpréteur de commandes est appelé un shell (ʺCoquilleʺ autour du noyau de l’OS). Il en existe plusieurs et ce document présente le bash (Bourne‐Again Shell). 1) Le bash a) Démarrage • /bin/bash précisé dans /etc/passwd • interprétation des fichiers : 1. /etc/profile communs à tous les utilisateurs y compris root On y trouve notamment la définition du prompt 2. le fichier $HOME/.bash_profile, sʹil existe (sinon le fichier $HOME/.bash_login) 3. /etc/bashrc définition des alias globaux 4. $HOME/.bashrc, sʹil existe b) Edition des commandes • <ctrl> e : place le curseur en fin de ligne • <ctrl> a : place le curseur en début de ligne • <ctrl> u : efface les caractères du début de ligne jusquʹau curseur • <ctrl> s : arrêt du défilement à lʹécran • <ctrl> q : reprise du défilement à lʹécran • <alt> b, <alt> f : déplace le curseur dʹun mot en arrière (backward)/en avant (forward) • <TAB> : complétion : sur le premier mot, complète avec les commandes possibles, pour les autres mots complète avec un nom de fichier du répertoire courant • !! : rappelle la dernière commande • !xxx : rappelle la dernière commande commençant par xxx. • history : affiche la liste numérotée des dernières commandes tapées • !n : rappelle la commande numéro n • ~ : pour référencer un utilisateur (ex : cd ~nom_utilisateur) ou le répertoire utilisateur (ex : cd ~/Monrep) • certains caractères sont spéciaux ( ʺ ʹ ; < > [ $ ‐ ^), \ pour les déspécialiser (ex : \$) c) Variables • env : affiche la liste des variables dʹenvironnement HOME : répertoire personnel USER : nom de lʹutilisateur PATH : listes des répertoires dans lesquels le shell cherche les commandes PS1 : prompt PWD : rep. courant 2007
Administration système et réseaux
2
• affichage dʹune variable : echo $var • $var : valeur de la variable • affichage dʹune variable : echo $HOME • affectation : PATH=$PATH:./bin PS1=ʺsalut>ʺ PS1=ʺ[\t \d \u@\h \w \$]ʺ // affiche [heure date username@machine rép. $] • possibilité dʹajouter ses propres variables machaine=ʺsalut la fouleʺ echo $machaine • set : liste de toutes les variables (environnement + utilisateur) d) Complétion des noms de fichiers Caractère
Interprétation
?
un caractère quelconque
*
une chaîne de caractère quelconque (éventuellement vide)
[
début de définition dʹun ensemble
[^
début de définition de complément dʹun ensemble
]
fin de définition dʹun ensemble
‐
marque dʹintervalle dans un ensemble e) Délimiteur de chaînes ʹ (simple quote) : tous les caractères à lʹintérieur dʹune telle chaîne perdent leur aspect spécial (sauf ʹ) ex : echo ʹj\ʹaime payer en $ʹ ʺ (double quote) : les caractères $ \ ` et ʹ sont spéciaux ex : echo ʺmon nom est $USERʺ ` (anti quote ou backquote) : la chaîne est interprétée comme une commande. ex : echo ʺla date actuel est `date`ʺ f) Commandes internes et externes • Les commandes externes sont des programmes exécutables placés dans les répertoires de la variable PATH. Les commandes internes sont exécutées par le shell, elles consistent généralement en lʹaffichage ou la modification de variables du shell. • Commandes internes courantes : cd, set, unset, env, alias, unalias, p (retour au répertoire précédent) • which est une commande qui affiche le chemin dʹune commande externe. Ex : which ls affiche /bin/ls 2007
Administration système et réseaux
3
2) Redirections • Chaque processus est lié à 3 fichiers (entrée, sortie, erreur), ceux‐ci peuvent être précisé sur la ligne de commande : a) Redirection dans un fichier rôle
exemple
<
redirige lʹentrée standard
cat < toto.txt
>
redirige la sortie standard
ls –l > titi.txt
2>
redirige la sortie erreur
find . –name ʺ*.psʺ –print 2> /dev/null b) Redirection vers une commande • opérateur pipe (caractère |) signifiant tuyau. • cmd1 | cmd2 | … | cmdn redirige la sortie de cmd(n‐1) dans lʹentrée de cmdn 3) Lancement de commandes en arrière plan • une commande peut être lancée en arrière‐plan par : commande & de cette façon, la commande nʹest plus liée au terminal et le shell reprend la main. Attention : le shell reste le processus père et les commandes en arrière‐plan sont tuées lorsque le shell meurt (pour éviter cela : nohup commande) • liste de commandes en arrière‐plan : jobs • faire passer la commande en cours dʹexécution en arrière‐plan : <ctrl>Z (stoppe la commande) puis bg background) • faire passer une commande en avant plan : fg numéro_commande (foreground) 4) Enchaînement conditionnels des commandes • Les séparateurs && et || sur la ligne de commande sont des séparateurs qui jouent les rôles dʹopérateurs conditionnels, en ce sens que la 2ème commande sera exécutée en fonction du code de retour de la 1ère commande. • Dans commande1 && commande2, commande2 ne sera exécutée que si le code de retour de commande1 est 0 (exécution correcte) • Dans commande1 || commande2, commande2 ne sera exécutée que si le code de retour de commande1 est différent de 0 (exécution erronée) Exemples : cd ~/tmp || mkdir $HOME/tmp
5) Expressions régulières Certaines commandes permettant de filtrer des chaînes de caractères utilisent des expressions régulières. Celles‐ci servent à exprimer des motifs du type ʺtoutes les lignes ayant une lettre en début de ligne et une lettre en finʺ. Elles sont utilisées dans les commandes grep, sed et dans certains éditeurs de texte (vi, nedit, etc.) Soit R et S deux expressions régulières : 2007
Administration système et réseaux
4
expression régulière
x
.
[xyz]
[^bz]
[a‐z]
[^a‐z]
R*
R+
R?
R{2, 5}
R{2,}
R{2}
RS
R|S
^R
R$
signification
le caractère x
nʹimporte quel caractère sauf \n
soit x, soit y, soit z
tous les caractères sauf b et z
nʹimporte quel caractère entre a et z
tous les caractères sauf ceux compris entre a et z
zéro R ou plus
au moins une fois R
zéro ou une fois R
entre 2 et 5 fois R
au moins deux fois R
exactement deux fois R
concaténation dʹexpr. régulières R suivi de S
R ou S
R en début de ligne
R en fin de ligne 6) Shell script bash Le terme script désigne un fichier exécutable par le shell. Il contient des commandes externes, des commandes internes et des commentaires. Un script peut contenir des structures de contrôle (if, while, etc.). Quand on lance lʹexécution dʹun script, le shell lit et exécute séquentiellement les lignes de ce fichier qui, pour le shell qui lʹexécute, joue le rôle de lʹentrée standard dʹun shell interactif. Un script est un fichier texte, il ne sʹagit pas dʹun fichier exécutable (binaire), il est interprété par le shell. Il n’est donc pas traduit en langage machine. a) Généralités • le caractère # indique un commentaire, celui‐ci sʹétend jusquʹà la fin de la ligne. • un script commence toujours par une ligne qui indique le shell utilisé, elle est de la forme #!/bin/bash et indique ici que le script sera exécuté par un shell bash (et récupère les variables dʹenvironnement du shell de lancement).
• un fichier contenant un script doit être explicitement rendu exécutable (chmod u+x nomfichier) • on exécute un script comme un fichier exécutable, en tapant sur la ligne de commande le nom du fichier contenant le script • entrée/sortie : echo et read • toutes les variables sont de type chaîne de caractères. Néanmoins, certaines commandes permettent de les considérer comme des entiers ou des réels (test, expr, bc) • variables spéciales : valeur de sortie de la dernière commande. $?
Elle vaut 0 si la commande sʹest déroulée sans pb.
$0
contient le nom du fichier script
$1 à $9
(éventuels) premiers arguments passés à lʹappel du script
$#
nombre dʹarguments passés au script $*
liste des arguments à partir de $1
$$
PID du processus courant
$!
PID du processus fils • Il nʹy a que 9 paramètres de position de $1 à $9, et si davantage de paramètres sont transmis, il est possible de les récupérer par la commandes shift qui effectue un décalage de 1 dans les variables $ : $1 prend la valeur de $2, etc... 2007
Administration système et réseaux
b) La commande test • elle sert à vérifier des conditions sur des fichiers, des chaînes ou des expressions numériques. • elle admet 2 syntaxes (la seconde est la plus utilisée) : test option fichier [ option fichier ] • rend 0 pour indiquer un déroulement normal, ou un autre nombre si une erreur sʹest produite. Cette valeur numérique est stockée dans la variable spéciale $? • tester un fichier option
signification, le fichier
‐e
existe
‐f
est un fichier normal
‐d
est un répertoire
‐r | ‐w | ‐x
est lisible | modifiable | exécutable
‐s
nʹest pas vide • tester une chaîne option
signification
‐z | ‐n
la chaine est vide / nʹest pas vide
les chaines comparées sont identiques | = | !=
différentes • tester un nombre option
signification
‐eq | ‐ne
égal | différent
‐lt | ‐gt
strict. inf | strict. sup
‐le | ‐ge
inf ou égal | sup ou égal • opérations dans une commande test option
valeur
(and) 0 si les 2 expr sont vraies
[ expr1 ‐a expr2 ]
(or) 0 si lʹune des 2 expr est vraie
[ expr1 ‐o expr2 ]
[ ! expr1 ]
négation 5
2007
Administration système et réseaux
6
c) Structures conditionnelles • if suite-de-commandes then # séquence exécutée si suite‐de‐commandes rend une valeur 0 bloc‐instruction1 else # séquence exécutée sinon bloc‐instruction2 fi Attention : si then est placé sur la ligne du if, séparer avec un ; if commande; then ..... • Conditionnelles imbriquées Pour imbriquer plusieurs conditions, on utilise la construction : if commande1 then bloc‐instruction1 elif commande2 then bloc‐instruction2 else # si toutes les conditions précédentes sont fausses bloc‐instruction3 fi
• choix multiples case valeur in expr1) commandes ;; expr2) commandes ;; ... esac d) Structures itératives • boucle for for variable [in liste] do commandes (utilisant $variable) done Ce nʹest pas une boucle for comme dans les langages de programmation classiques (utiliser pour cela une boucle while). La variable parcours une liste de chaînes de caractères séparés par des espaces et le bloc commandes est exécuté pour chaque valeur. variable peut contenir des méta‐caractères pour représenter des fichiers Les mots‐clés do et done apparaissent en début de ligne (ou après un ;) La liste peut être explicite : for nom in jean toto stage1
do
echo "$nom, à bientôt"
done
La liste peut être calculée à partir dʹune expression modèle. Pour recopier tous les fichiers du répertoire toto for fich in /home/toto/*
do
cp $fich $HOME/sauvetoto
done 2007
Administration système et réseaux
7
Si aucune liste nʹest précisée, les valeurs sont prises dans la variable $@, cʹest‐à‐dire en parcourant les arguments courants de la ligne de commande. • Boucle while ‐ until while commande do commandes done until commande do commandes done Ces structures sont apparemment classiques, à la différence quʹici aussi la condition de poursuite (while) ou dʹarrêt (until) est une commande (ou une suite de commandes) considérée comme vraie, si sa valeur de sortie est 0, sinon la boucle se termine. • Sortie et reprise de boucle break placé dans le corps dʹune boucle, provoque une sortie définitive de cette boucle. continue permet de sauter les instructions suivantes et de ʺcontinuerʺ à lʹitération suivante. Pour les boucles for, while et until, continue provoque donc la réévaluation immédiate du test de la boucle. 2007
Administration système et réseaux
8
e) Fonctions nom‐fct() { bloc dʹinstructions } passage d'arguments Le mécanisme est le même que vis à vis dʹun script variables locales Dans le corps de la fonction, on peut définir et utiliser des variables déclarées locales, en les introduisant avec le le mot‐clé local f) Commandes supplémentaires • $((expresion arithmétique)) évaluation dʹune expression arithmétique • set Exemple dʹutilisation pour ʺéclaterʺ une ligne en mots, affectés aux variables de position # soit une chaine ch qui contient une liste de valeurs
ch="prof eleve classe note"
# set lit chaque mot de la liste et l'affecter aux paramètres de position
set $ch
echo $1 $2 $3 $4
shift
echo $1 $2 $3 $4
• eval considère la chaîne en paramètre comme une suite de commandes et les exécute (les commandes doivent séparés par ; ) • expr calculs numériques