Académique Documents
Professionnel Documents
Culture Documents
Script
Script
Ben Halima
Systèmes d’exploitation Enseignant :Iskandar Keskes
évolués Filière: T-MIM & P-IITMW
Année universitaire:
2007 -2008
TP N° 07
Les scripts Shell
Objectif :
A l’issue du TP l’étudiant devra :
• Etre capable d’éditer un fichier script utilisant des variables système et des variables
définies par l’utilisateur.
• Etre capable de calculer et de manipuler des variables chaîne de caractères ou
numériques.
• Etre capable d’utiliser des valeurs de retour d’appel de commandes.
• Etre capable d’enchaîner des commandes.
• Etre capable d’utiliser des structuras de contrôle dans les fichiers script.
Un Shell-script (ou script Shell) est un fichier texte simple. Il peut donc être écrit avec un
éditeur de texte. La toute première ligne du fichier doit contenir le nom de l'interpréteur à
utiliser (cela est valable pour tous les langages de script). Cette ligne doit commencer par
#! suivi de l'exécutable à utiliser. Pour un Shell-script bash, on aura donc en début le
fichier par : #!/bin/bash
La première ligne contient le chemin d’accès et le nom du Shell à utiliser pour ce fichier script.
(Il existe plusieurs Shell différents, qui n’utilisent pas la même syntaxe.)
1/18
• Lancez ce script en saisissant son nom sur la ligne de commande. Que ce passe-t-
il ? Pourquoi ?
• Attribuez le droit d’exécution au propriétaire et lancer la commande.
Un script se termine lorsque la dernière ligne a été exécutée. On peut toutefois forcer sa
sortie avant en utilisant la commande exit. Le code de retour du script sera celui de la
dernière commande exécutée. Cela à moins de préciser une valeur numérique à la suite de
exit. C'est alors celle-ci qui sera renvoyée
Le Shell détermine Si la commande est une commande qu’il connaît (interne) ou non
(externe).
interne exécution
externe recherche du fichier dans les répertoires indiqués par la variable
d’environnement PATH.
Si le fichier n’est pas trouvé, affichage d’un message d’erreur.
Si le fichier est trouvé il faut déterminer si c’est un fichier binaire ou autre.
- binaire lancement d’un nouveau Shell, chargement de l’exécutable
puis exécution.
- script lancement d’un nouveau Shell puis interprétation des
commandes.
Ces variables permettent de stocker des valeurs pour pouvoir les utiliser plus
tard. Elles n'ont pas besoin d'être déclarées. bash les créera dès la première
utilisation
Déclaration: variable=valeur (sans espaces)
Le signe = permet de faire l'affectation. Il est indispensable de ne pas mettre
d'espace avant ou après ce signe, ce qui est une erreur fréquente
2/18
Règles de constitution d’un nom :
Le nom est constitué par des lettres minuscules et majuscules, des chiffres et le
caractère soulignement.
Contrainte : pas de chiffre en tête, ni de soulignement.
Convention : variables utilisateur en minuscules.
valeur ne doit pas contenir d'espace non plus. Si on veut affecter une chaîne de
caractères en comprenant, on utilisera des guillemets :
Pour accéder ensuite à la valeur d'une variable, on préfixe son nom avec $ (dollar).
Celui-ci est sensible à la casse. Le moyen le plus simple de tester la valeur d'une
variable est d'utiliser la commande echo qui affiche ce qu'on lui passe en paramètre.
echo $phrase
⇒ une valeur avec des espaces
On peut également accéder à la valeur d'une variable en rajoutant des accolades autour
du nom, ce qui est parfois utile.
phrase="une valeur avec des espace" # des espace(sans ‘s’)
echo ${phrase}s
⇒ une valeur avec des espaces
Saisie de variables :
3/18
Lorsqu’une commande est placée entre parenthèses suivant un $, cette commande
est remplacée par les sorties que fait la commande sur le canal standard
Exemples :
ici=$(pwd)
echo $ici
mes_fichiers=$(ls -l)
echo $mes_fichiers
L’expression entre parenthèse peut être complexe et associer des tubes.
Affichage de variables :
La commande echo admet les paramètres suivants permettant une mise en forme:
\a alarme sonore
\n saut de ligne
\b retour arrière
\t marque de tabulation
\c fin de la sortie et annulation saut de ligne
\\ affichage d’un backslash
\ On indication d’un nombre octal sut n positions pour caractères spéciaux
Exemple : echo « bonjour \n Albert »
Export variable :
4/18
La commande export utilisée seule montre toutes les variables exportées. Une
variable exportée peut être modifiée dans un sous-Shell. Mais les modifications ne
pourront être transmises qu’à des Shells de niveau inférieur. Elles ne seront pas
reportées aux Shells de niveau supérieur
Les différents opérateurs sont traités par ordre de priorité (que l’on ne connaît pas
forcément par cœur!). Il est conseillé de placer des parenthèses pour forcer l’ordre
souhaité.
Exemples :
declare -i a
a=“7 < (16/2)”
echo $a
Expliquez le résultat
Les tableaux :
bash permet aussi d'avoir des variables tableaux. Celles-ci sont des tableaux associatifs.
La clé pour y accéder peut être n'importe quelle chaîne de caractères. Par défaut ce
seront des numériques commençant à 0. Les tableaux sont aussi créés automatiquement.
Pour initialiser un tableau en une seule opération :
On accède ensuite à un élément par ${tableau[clé]} où clé sera ici un nombre entre 0 et
2.
5/18
echo ${tableau1[2]}
⇒ valeur2
On peut par cette même notation affecter une valeur à l'élément du tableau. Si on
affecte la valeur à un élément qui n'existe pas encore, il sera créé. Il ne doit pas
nécessairement être à la suite du dernier élément. On peut créer celui d'indice 5 sans
que les 3 et 4 n'existent.
${tableau1[5]}=valeur5
Pour créer un tableau en n'utilisant pas les indices par défaut, on utilisera la syntaxe
suivante :
Où les clés peuvent être n'importe quelles chaînes de caractères. A un tableau créé avec
les index numériques par défaut, on peut très bien ajouter un élément dont la clé est une
chaîne de caractères.
a) Les guillemets doubles ("). Leur rôle est de regrouper plusieurs chaînes de
caractères séparées par des espaces. Si un programme accepte un seul paramètre,
l'exécution suivante génèrera une erreur :
ma_commande une phrase en paramètre
⇒ Erreur : ma_commande n'accepte qu'un paramètre
Car là on lui a passé 4 paramètres. Alors que dans le cas suivant, ma_commande
recevra un seul paramètre contenant la chaîne complète :
Cela est aussi utile pour affecter à une variable une chaîne de caractères
comprenant des espaces.
Si une variable est contenue entre les doubles guillemets (avec le $ devant le
nom), elle est remplacée par sa valeur.
b) Les guillemets simples (') jouent le même rôle. La différence vient du fait
qu'aucune substitution de variable n'est effectuée. La chaîne comprise entre ' '
conservera les caractères $
c) Les guillemets inversés (`). Ils permettent d'exécuter une commande. La chaîne
comprise entre ` ` vaudra le résultat retourné par la commande. Les variables sont
remplacées par leurs valeurs avant l'évaluation de la commande. Cela est souvent
utilisé pour affecter un résultat à une variable. Pour l'exemple suivant, la commande
intégrée pwd permet d'afficher le répertoire courant.
6/18
REPERTOIRE=`pwd`
echo $REPERTOIRE
⇒ /home/user01
REPERTOIRE=$(pwd)
On peut facilement évaluer des expressions arithmétiques avec bash. Pour cela, on utilise la
notation $(( )) qui sera remplacée par le résultat du calcul mathématique. Voici les
opérations pouvant être utilisées par ordre de priorité inverse (extrait de la page de manuel
de bash) :
La commande test :
Tester un fichier :
7/18
Tester chaîne de caractère :
Combinaison de tests :
! (négation du test)
-a et logique
-o Ou logique
Enchaînement de commandes :
En plus du tube | ou du ; déjà vu, le Shell permet d’enchaîner des commandes de manière
conditionnelle, la deuxième commande ne s’exécute que si la première a réussi && (valeur
0) ou si elle a échoué || (valeur 1).
Exemple :
test -r fic && echo «vous pouvez lire ce fichier»
test -s fic || echo «ce fichier n’est pas vide»
La commande test est très souvent en relation avec une structure de type if
if commande ; then
liste de commandes
fi
if commande ; then
liste de commandes
else
liste de commandes
fi
8/18
Condition multiple: if then ... elif then ... fi
if commande ; then
liste de commandes
elif commande ; then
liste de commandes
else
liste de commandes
fi
1.6.2 Instructions de boucle :
Exemple 1:
for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
done
Exemple 2:
while commande
do
liste de commandes
done
until commande
do
liste de commandes
done
1.6.3 Instructions de rupture de boucle :
9/18
revenir au début de la boucle for, while, until
n = niveau de boucle à partir de la boucle la plus externe
Exemple :
do
done
case $variable in
motif1) liste de commandes ;;
10/18
motif2) liste de commandes ;;
*) liste de commandes ;;
esac
Exemple:
case $# in
1) arg1=$1;;
2) arg1=$1; arg2=$2 ;;
0) echo "usage: $0 arg1 [ arg2 ]
exit 1;;
esac
1.6.5 Création de menu :
select
C’est une instruction bash qui permet la création de menus.
Structure Exemple
select var in PS3 = "Entrer votre choix : "
liste_var select fruit in pomme orange banane
do peche
do
commandes case $fruit in
pomme) echo "une pomme a 80
done calories";;
orange) echo "une orange a 65
calories";;
banane) echo "une banane a 100
calories";;
*) echo "Mauvaise entrée !";;
esac
done
var et liste sont semblables à ceux de for. Liste désigne la liste d'options.
La valeur de la variable réservée PS3 est utilisée comme prompt après l'énumération
des options de menus.
Les entées avec le prompt sont enregistrées dans la variable REPLY .
L'utilisateur sort de la boucle de menus en tapant le caractère ^D.
select fonctionne avec la liste des paramètres en l’absence du mot clé in (idem for et
while).
11/18
Le comportement d’un script peut être modifié en « passant » un ou plusieurs
paramètre(s) via la ligne de commande. Soit le script essai01.sh :
# !/bin/bash
#essai01.sh
echo le paramètre \$1 est \"$1\"
echo le paramètre \$2 est \"$2\"
echo le paramètre \$3 est \"$3\"
Le résultat est :
…………………………….
…………………………….
…………………………….
Donc, les variables $1, $2, …, $9 contienne les « mots » numéro 1, 2, …,9 de la ligne
de commande.
Tapez : essai01.sh *
Le résultat est :
…………………………….
…………………………….
…………………………….
Tapez : essai01.sh \*
……………………………………………………………………………………………
………………………………………………………………………………………
Le langage du Shell est un langage procédural. Cela signifie que l'on peut créer des
fonctions pour regrouper des séries d'instructions couramment exécutées. La syntaxe
permettant d'écrire de telles fonctions est la suivante :
function nom () {
…
instructions
12/18
…
}
Les fonctions reçoivent les paramètres d’appel dans les variables $1 à $9 et $*. La
valeur de $0 reste inchangée.
Exemple :
Il est possible de déclarer des variables locales à une fonction en utilisant la commande
locale avant la déclaration de la variable. Dans ce cas, la modification de la variable
locale ne modifie pas une variable globale portant le même nom.
Les fonctions peuvent retourner une valeur numérique en code de retour. Cette valeur
peut être indiquée à l'aide de l'instruction return.
function somme () {
local result=0
local i=0
while [ $i -le $1 ] ;
do
result=$(($result + $i))
i=$(($i + 1))
done
return $result
}
13/18
Ce code d'erreur pourra être récupéré par l'appelant dans la variable d'environnement
$? :
somme 10
echo $?
2. Exercices:
1. Ecrire un script Shell qui affiche les répertoires de votre répertoire courant.
2. Ecrire un script Shell qui calcule le carré d’un nombre entier différent de zéro.
3. Ecrire un script Shell qui transforme les caractères majuscules des noms de fichiers de
votre répertoire courant en caractères minuscules (utiliser typeset).
4. Ecrire un script Shell qui demande à l'utilisateur s'il souhaite afficher ou non les fichiers
cachés du répertoire courant.
5. Ecrire un script Shell qui affiche les 100 premiers nombres.
6. Ecrire un script Shell qui permet de renommer tous nos fichiers *.tar.gz en
*.tar.gz.old.
7. Ecrire un script Shell qui permet de tester la présence de l'utilisateur user01 dans le
fichier /etc/passwd.
8. Ecrire un script Shell qui reçoit trois paramètres et qui affiche leurs valeurs. Un
message d'erreur sera affiché si le nombre de paramètres est différent de trois.
9. Donnez le programme Shell qui permet d’afficher le contenu des fichiers donnés
comme paramètre. Faites en sorte qu’il demande à chaque fichier une confirmation.
10. Ecrire un programme Shell qui permet de tester si deux fichiers donnés en paramètres
sont liés (commande test fichier1 –ef fichier2)
11..Ecrire un programme Shell qui permet de tester si le fichier1 est plus récent que le
fichier2 (les deux fichiers sont donnés en paramètres). (commande test
fichier1-nt fichier2)
12. Ecrire un programme Shell qui permet de tester si le fichier2 est plus récent que le
fichier1 (les deux fichiers sont donnés en paramètres). (commande test
fichier1-ot fichier2)
13. Ecrire un programme Shell qui reçoit plusieurs paramètres (des noms de fichiers). Pour
chaque fichier reçu, il s’agit d’effectuer les tâches suivantes
a. Si le fichier est ordinaire vous lui ajouter le droit de lecture, s’il ne l’a pas déjà.
b. Si le fichier est un répertoire vous lui ajoutez le droit « x ».
c. - Sinon vous réinitialisez toute la chaîne de permission relative au propriétaire à
«rwx ».
14/18
14. Ecrire un script qui reçoit comme paramètre un nom de fichier s’il ne reçoit aucun
paramètre, il doit afficher un message d’erreur: paramètre manquant. Le fichier reçu
comme paramètre sera afficher en indiquant sont type et ses droit d’accès.
15. Le script boucle affiche des nombres à l’écran il sait traiter jusqu’à trois paramètres. Le
premier est la valeur de départ, le second est la valeur finale et le 3ème est l’incrément.
Si deux paramètres seulement sont spécifiés, l’incrément par défaut sera 1. En présence
d’un paramètre unique, la valeur final sera 20. En absence de tout paramètres on affiche
tous les chiffres entre 1 et 20 avec un pas égale à 1.
16. Ecrire un script qui permet d'afficher le squelette d'un menu de la façon suivante :
Menu
1 choix 1
2 choix 2
3 choix 3
4 choix 4
0 Quitter
Entrez votre choix: -
17. Ecrire un script qui permet de copier la sous arborescente d'un répertoire dans un autre.
Ce script admet deux paramètres, le premier est la sous arborescence à copier et le
deuxième est le répertoire où on va faire la copie.
3. Annexe :
3.1 Variables d’environnement prédéfinies :
HOME Chemin absolu du répertoire personnel
IFS Caractères séparateur des mots, le blanc par défaut
LOGNAME Le login
MAIL Définit le fichier où le système va voir si l’utilisateur a reçue des messages.
Intervalle de temps respecté par le Shell avant d’aller vérifier la BAL
MAILCHECK
(exprimé en s)
liste de fichiers supplémentaires à parcourir pour le courrier, les fichiers sont
MAILPATH
séparés par des :, le signe % suivi d’un texte affiche un message.
liste des répertoires séparés par :, permet de spécifier au Shell l’ordre de
PATH
recherche des commandes externes
facilite le changement de répertoire par CD en indiquant les répertoires dont
CDPATH
les sous répertoires doivent être parcourus
BASH chemin d’accès absolu vers le nom du Shell utilisé
BASH_VERSION version du BASH
PS1 prompts standard que le Shell affiche à l’écran
PS2 contenu affiché en cas d’erreur de syntaxe
Utilisé par la commande select pour afficher un prompt devant les entrées
PS3
des menus
PS4 valeur par défaut + pour compatibilité avec le boume Shell
RANDOM contient à chaque accès une valeur aléatoire comprise entre 0 et 32767
15/18
Contient le nom du fichier à exécuter à chaque appel du Shell, contient
ENV
souvent ~/.bashrc.
HISTFILE Nom du fichier historique des commandes, par défaut ~/.sh_history
Nombre de commandes devant être enregistrées dans le fichier historique
HISTSIZE
(500 par défaut), attention ça passe par des mémoires tampons
permet de ne pas définir de variable pour stocker une saisie utilisateur, la
REPLAY
commande read ou select peuvent lire la réponse de l’utilisateur ici.
SECONDS nombre de secondes depuis l’activation du Shell
VISUAL contient vi ou emacs on détermine quel éditeur est intégré au Shell
SHELL type de Shell utilisé (AIX)
TERM type de terminal (AIX)
EDITOR nom de l’éditeur à utiliser (AIX)
PWD répertoire courant (AIX)
PPID numéro du process père (AIX)
OLDPWD Nom du répertoire précédent (AIX)
\t heure actuelle
\d date actuelle
\n saut de ligne
\s Nom du Shell
répertoire de travail, un ~ s’affiche si l’on se trouve dans le
\w
répertoire personnel
\u nom d’utilisateur
\h nom de l’ordinateur
\! numéro de commande courant
\nnn Remplacé par le caractère représenté par nnn en base 8
\\ un backslash
Elles ne sont accessibles qu’en lecture, elles sont gérées par le Shell.
$?;valeur de retour de la dernière commande exécutée
$$ numéro du process en cours (PID)
$ ! numéro du dernier process en arrière plan
$- option du Shell
$0 premier paramètre (nom de la commande)
$1 2eme paramètre
…
$9 10eme paramètre
$* tous les paramètres
$@ tous les paramètres sous forme séparée
$# Nombre de paramètres passé à la commande
Opérateurs sur les variables entières :
+-*/ Opérations de base sur les variables entières (integer)
% modulo reste de la division entière (integer)
< > >= <= comparaison, la valeur retournée sera 1 si vrai O si faux
= = != égalité et inégalité
&& || comparaison avec le ET logique ou le OU logique
16/18
comparaison bit à bit de la variable & (ET), | (OU), ^ (OU
&|^
exclusif)
17/18
3.5 Les Shells
18/18