Utilisation de Bash pour faire des scripts. - Capa-IUP

Transcription

Utilisation de Bash pour faire des scripts. - Capa-IUP
Utilisation de Bash pour faire des scripts.
Support des TPs de Système d'Exploitation, écrit par Stanislas Oger ([email protected])
Bash est le shell du projet GNU, c'est celui par défaut sur la plupart des distributions linux.
Un shell est une interface utilisateur en mode texte qui permet de piloter le système
d'exploitation. Dans un shell Bash on tape des commandes qui sont exécutées par le
système. Bash permet également d'écrire des scripts, qui sont des suites de commandes,
et met à disposition des utilisateurs plusieurs structures de contrôle.
Ecrire un script bash
Un script bash est un fichier texte dont l'extension est par convention « .sh » et qui
commence par un shebang indiquant au système de quel type de script il s'agit. Le
shebang est une ligne commencant par « #! » suivi du chemin vers l'interpréteur
correspondant au script. Par exemple pour bash, le shebang est « #!/bin/bash ». Voici un
script bash minimaliste affichant « coucou » :
#!/bin/bash
echo « coucou »
Executer un script bash
Si votre script s'appelle toto.sh, alors pour le lancer il faut taper dans une console :
bash toto.sh
Recupérer les paramètres passés à un script
Dans un script bash, les paramètres passés au programme sont enregistrés dans les
variables $1, $2, etc. La variable $# contient le nombre de paramètres passés au
programme. Par exemple, pour vérifier qu'on a bien passé un paramètre à un script et
mettre le paramètre dans une variable $toto :
#!/bin/bash
if [ $# -ne 1 ]
then
echo
« Vous
programme. »
exit
fi
devez
passer
exactement
un
paramètre
au
toto=$1
echo « Vous avez passé le paramètre $toto au programme »
Les variables
Pour affecter une valeur a une variable on utilise la syntaxe suivante :
ma_variable=ma_valeur
Pour l'utiliser ensuite on utilise son nom précédé d'un caractère '$'. Par exemple pour
afficher la valeur d'une variable en utilisant la commande echo :
echo «ma variable vaut $ma_variable »
Pour affecter a une variable la valeur d'une autre variable, il faut faire :
ma_nouvelle_variable=$mon_ancienne_variable
Les structures de contrôle
Le test conditionnel
if <condition>
then
faire quelque chose
else
faire autre chose
fi
La boucle while
while <condition>
do
faire quelque chose
done
La boucle for
for i in 1 2 3 4
do
faire quelque chose
done
la condition
La condition (« <condition> » dans les exemples précédents) peut être de plusieurs
forme :
1 - Encadré par des crochets :
test de chaine de caractère : [ « $ma_variable » == « toto » ] teste si la variable
« ma_variable » vaut « toto ». L'opérateur != signifie différent.
comparaison de nombres : [ $mon_nombre -lt 3 ] teste si la variable mon_nombre vaut
moins que 3. Les opérateurs de comparaison suivant peuvent être utilisés :
• -lt (less than) : strictement inférieur à
• -gt (greater than) : strictement supérieur à
• -eq (equal) : égal à
• -ne (not equal) : différent
• -ge (greater or equal) : supérieur ou égal
• -le (less or equal) : inférieur ou égal
Pour plus d'informations consulter le manuel de test (en console tapez « man test »)
Exemple :
if [ $toto -le 2 ]
then
echo « la variable toto est inférieure ou égale à 2 »
fi
2 - Directement une commande
Par exemple pour faire quelque chose si la commande « who | wc -l » fonctionne :
if who | wc -l
do
faire quelque chose
done
Recupérer la sortie d'une commande
Il faut exécuter la commande dans l'environnement $(). Par exemple pour récupérer la
sortie de la commande « who » dans une variable $toto :
toto=$(who)
Rediriger la sortie d'une commande dans un fichier
Pour écrire la sortie d'une commande dans un fichier il faut utiliser les opérateurs de
redirection de flux. Par exemple, pour rediriger la sortie de la commande « who » dans un
fichier toto.txt, il faut faire :
who > toto.txt
Il existe plusieurs opérateurs de redirection, les deux principaux sont '>' et '>>'. Le premier
redirige la sortie vers un fichier et écrase son contenu, alors que le second ajoute la sortie
à la fin du fichier.
Enchainer plusieurs commandes
Pour enchainer plusieurs commandes, c'est à dire fournir en entrée d'une commande la
sortie d'une autre, on utilise le caractère pipe : '|'. Par exemple pour utiliser la commande
cut pour découper la sortie de la commande who, on peut faire :
who | cut -f1 -d' '
Où trouver les utilisateurs du système
Le fichier /etc/passwd contient la liste des utilisateurs du système avec des informations
les concernant.
Pour plus d'infos, lire le man 5 le concernant : « man 5 passwd »
Où trouver les groupes du système
Le fichier /etc/group contient la liste des groupes du système avec des informations les
concernant.
Pour plus d'infos, lire le man 5 le concernant : « man 5 group »
Quelques commandes
Pour toutes les commandes présentées ici vous pouvez avoir plus d'information en lisant
la page de man les concernant. Pour cela il faut taper dans une console la commande
suivante : « man <le nom de la commande> », avec « <le nom de la commande > » le
nom de la commande en question. Exemple : pour avoir l'aide de la commande « cat », on
tape « man cat ». Lire la documentation d'une commande doit être un réflexe pour vous,
c'est le seul moyen de vous en sortir face à de nouvelles situations et c'est ce que l'on
vous demandera dans le milieu professionnel : de l'autonomie.
Commande « echo »
Affiche une chaine de caractère. Par exemple pour afficher « la variable toto vaut
<valeur_de_toto> » :
echo « la variable toto vaut $toto »
Commande « cat »
Affiche le contenu d'un fichier.
Commande « who »
Affiche les utilisateurs actuellement connectés sur l'ordinateur.
Commande « groups »
Affiche le groupe d'un utilisateur. Exemple « groups toto » affiche le groupe de l'utilisateur
« toto ».
Commande « cut »
Permet de ne conserver que certaines parties d'une ligne grâce à l'option « -f ». Par
exemple « echo titi toto tata | cut -f2 -d' ' » affichera le second champ (option -f2) de la
ligne « titi toto tata » en utilisant le caractère ' ' comme séparateur (option -d' '), ce qui
donne « toto ».
Commande « date »
Affiche la date.
Commande « whoami »
Affiche l'utilisateur avec lequel vous êtes connecté
Commande « history »
Affiche la liste des commandes que vous avez tapé jusqu'à maintenant.
Commande « grep »
Permet de ne conserver que les lignes qui contiennent une chaine de caractère passée en
paramètre.
Commande « df »
Affiche les disques du système avec leur taille et l'espace occupé.
Commande « lsof »
Affiche la liste des fichiers ouverts avec le nom du programme et l'utilisateur qui est en
train de le faire.
Commande « tar »
Créé une archive tar optionnellement compressée. Par exemple la commande « tar cfz
toto.tar.gz le_repertoire_toto » va compresser (option c) le répertoire « le_repertoire_toto »
en tar.gz (option z) dans le fichier « toto.tar.gz » (option f).
Commande « find »
Recherche des fichiers dans un répertoire suivant différent critères. Par exemple « find
repertoire_titi -readable » va afficher tous les fichiers accessibles en lecture (option
-readable) se trouvant dans le répertoire « repertoire_titi ».
Commande « read »
C'est une commande interne à bash qui permet de mettre le contenu d'une ligne dans des
variables. Cette commande est très utile lorsqu'on veut lire le contenu d'un fichier ou la
sortie d'une commande ligne par ligne. Par exemple, pour lire ligne par ligne la sortie de la
commande « who » on fait :
who | while read ligne
do
echo « $ligne »
done
Si la commande ou le fichier est structuré, il est possible d'affecter chaque champ à une
variable différente grâce à la commande read. Par exemple la commande who renvoie
une sortie structurée de la forme :
<utilisateur> <terminal> <date> <heure>
On peut donc directement faire l'affectation dans des variables :
who | while read utilisateur terminal date heure
do
echo « L'utilisateur $utilisateur est dans le terminal
$terminal depuis le $date à $heure »
done
Quelques références
Pour avoir plus d'informations sur l'utilisation de base et sur le scripting, vous pouvez
consulter les documentations suivantes :
en console :
man bash
sur le Web :
http://www.trustonme.net/didactels/148.html
http://fr.wikipedia.org/wiki/Bourne-Again_shell
http://marcg.developpez.com/ksh/
etc.
ou plus généralement :
http://www.google.fr/#q=bash