UNIX Systeme/shell
SRIT - niveau 2
Entrainements sur les structures Sujet 5 (TP) – 2014/2015
Département Informatique
Commandes
En shell chaque ligne de commandes, après avoir subie les modifications classiques, est découpée en mots. Un mot
est un ensemble de caractères quelconques séparé d’un autre mot par un ou plusieurs caractères d’espacements (espace,
tabulation horizontale ou verticale). Le premier mot de la ligne correspond au nom de la commande. Les autres mots sont
appelés les arguments de la commande.
On rappelle que sur une ligne de commande tous les caractères suivants un « # » sont ignorés par le shell.
Lorsque le langage de commandes (shell) a identifié une commande (le premier mot d’une ligne ne comportant pas le
caractère « = ») à exécuter sur une ligne lue, il va essayer de l’exécuter. Pour cela :
1. si le nom de la commande correspond à une commande interne, elle est exécutée directement avec comme argu-
ments le reste de la ligne ;
2. sinon il détermine le chemin et le fichier correspondant à la commande :
— si le nom de la commande contient au moins un caractère « / » le shell extrait le répertoire de ce nom ;
— sinon pour tous les répertoires définis dans la valeur de la variable PATH le shell cherche un fichier exécutable
correspondant au nom de la commande ;
3. Si un fichier a été trouvé et qu’il est exécutable alors il est exécuté dans un nouveau processus, sinon un message
d’erreur est envoyé sur la sortie d’erreur.
La variable PATH contient donc une liste des répertoires pouvant contenir des commandes. Cette liste est en fait une
suite de chemin accèdant à des répertoires. Chaque répertoire est séparé de ces voisins par un caractère « : ».
Codes de retour
Sous Unix, juste après leur exécution toutes 1 les commandes fixent un code de retour (status en anglais) décrivant l’état
de leur déroulement. Ce code est stocké dans le contexte d’exécution du processus. Il est accessible via la variable ?. Par
convention lorsqu’une commande s’est bien déroulée ce code a pour valeur 0, dans le cas contraire une valeur différente
de 0 (souvent 1). Si le mot réservé ! est utilisée devant une commande alors le code de retour de la commande sera
inversé (0 si la commande se passe mal et une valeur différente de 0 si elle se passe bien).
En shell ce code de retour peut-être utilisé pour créer des séquences d’instructions conditionnelles grâce au 2 opérateurs
&& et || ou à des structures de contrôle plus évoluées ( if et while notamment).
Structures de contrôles
La séquence d’instructions peut être rompus grâce à la commande alternativ ou aux opérateurs logiques && et || :
1. si cmd-si réussit alors cmdsif exécutés
if cmd - si
2. sinon
then
cmdsif (a) si cdm-sinon-si réussit alors cmdselif
elif cmd - sinon - si exécutés
cmdselif (b) sinon cmdselse est exécutés
else
cmdselse
fi
Les séquences d’instructions peuvent être répétées grâce à 2 commandes internes. Une de ces structures de boucle permet
de spécifier une liste de valeurs pour lesquelles une suite de commande doit être exécutée :
1. Toutes les commandes, y compris les filtres. Par exemple, par défaut, la commande grep réussie si et seulement si elle laisse passer des
lignes. Référez-vous aux pages du manuel pour en savoir plus.
1
— cmds exécutés autant de fois qu’il y a d’élé-
for var in liste ment dans liste
do — Pour chaque tour $var a comme valeur un des
cmds
éléments de liste .
done
— Éléments utilisés de la gauche vers la droite de
la liste
— liste est définie après les développements du
shell
L’autre structure, plus classique, utilise le code de retour d’une commande pour décider, ou non, de répeter une suite
d’instructions :
while cmd - tq 1. cmd-tq est exécutée
do
2. si elle a réussit
cmdswhile
done (a) les cmdswhile sont exécutées
(b) retour en 1
Scripts
Sous Unix il est possible d’écrire des programmes en utilisant un langage de commandes quelconque. Pour cela il suffit
de regrouper dans un fichier respectant la convention texte (méthode Unix) des lignes de commandes.
Pour exécuter le programme il suffit alors d’exécuter :
1. que la première ligne du fichier définie le langage à utiliser :
#!/bin/bash
2. que le fichier doit être exécutable.
3. que le shell puisse trouver le fichier.
Le contexte d’exécution du processus déroulant le programme se voit affecter automatiquement un certain nombre de
variables correspondant aux éventuels paramètres de la ligne ayant servis à démarrer la commande :
— Les variables nommés $0 , $1 , $2 , etc. correspondent respectivement au premier, second, troisième, etc. mots
présents sur la ligne de commandes.
— La variable nommée $# contient le nombre d’arguments présents sur la ligne au moment de l’appel de la com-
mande.
— La variable nommée $* correspond à l’ensemble des arguments présents sur la ligne au moment de l’appel de la
commande.
Dans ce contexte la commande shift permet de déplacer le contenu des variables positionnels. Quand elle est appelée
sans paramètre elle permet de décaler le contenu des variables d’un cran vers la gauche à partir de la variable 1 , c’est-à-
dire que le contenu de la variable 1 est oublié et est remplacé par le contenu de la variable 2 , le contenu de la variable
2 est remplacé par le contenu de la variable 3 , etc. Dans ce cas le contenu des variables * et # est également mis à
jour.
Le code de retour d’un script correspond au code de retour de la dernière commande qu’il a exécutée.
Exercices
Exercice 1 : Comparaison des deux types de boucles
Q 1. Écrivez une commande, nommée compter-for , permettant d’afficher les entiers de 1 à 10, un sur chaque ligne en
n’utilisant uniquement la structure de contrôle for .
Q 2. Écrivez une commande, nommée compter-while , permettant d’afficher les entiers de 1 à 10, un sur chaque line
en n’utilisant uniquement la structure de contrôle while .
La commande time permet d’évaluer le temps d’exécution d’une commande. Pour plus de détails sur cette commande
référez-vous à la page du manuel correspondante.
Q 3. Comparez le temps d’exécution de la commande compter-for et de la commande compter-while .
2
Exercice 2 : Structure for
Q 1. Écrivez une commande, nommée liste-rep , qui envoie sur la sortie standard la liste des répertoires contenus dans
votre répertoire principal ( ${HOME} ).
Q 2. Écrivez une commande, nommée liste-exe , qui envoie sur la sortie standard la liste des fichiers exécutables
par tout le monde (propriétaire, groupe et autres utilisateurs) contenus dans tous les répertoires décrits par la variable
$PATH . Cette commande vous montre donc toutes les commandes qui vous sont accessibles.
Exercice 3 : Structure while
Q 1. Écrivez une commande, nommée majuscule , qui demande continuellemet à l’utilisateur de saisir une ligne puis
l’affiche convertie en majuscule. La commande doit s’arrêter quand l’utilisateur saisit comme ligne le mot fini .
Q 2. Écrivez une commande, nommé calculatrice , qui demande continuellement à l’utilisateur de saisir une opération
arithmétique puis affiche le résultat de celle-ci. La commande doit s’arrêter quand l’utilisateur saisit une expression vide.