Fiche 6 2023
Fiche 6 2023
Fiche 6 2023
1 Introduction
La séance de TD d’aujourd’hui à deux objectifs :
1. étudier des scripts plus complexes qu’un simple enchaînement de commandes ;
2. faire le second QCM noté (30 minutes).
Si vous n’avez pas terminé cette fiche avant le début du QCM, merci de la terminer chez vous.
Les points abordés dans cette fiche seront évalués dans le QCM de la semaine prochaine.
Dans le TD 3 nous avons vu qu’un script est un fichier texte contenant des commandes. Dans
le présent TD nous allons voir qu’il est possible de faire des scripts plus complexes. Le but de
cet enseignement n’est pas d’apprendre à programmer aussi nous n’allons pas étudier et encore
moins écrire de scripts de plus de quelques lignes. Il est important de bien comprendre ce que
font ces scripts et d’essayer d’anticiper leur comportement avant de les tester, sinon ce TD risque
de ne pas vous être très profitable.
En BASH, l’expression est « remplacée » par l’exécution d’une commande dont la valeur de retour
est utilisée pour décider de la suite du traitement, comme le font les opérateurs d’enchaînement
« && » et « || » déjà vus. À titre d’exemple reprenons sous la forme d’un script BASH avec un if
la question 4 de la section 3 de la fiche de TD 3 (« trouver et tester l’enchaînement de commandes
qui affiche "Le répertoire /root n’est pas accessible" si c’est bien le cas »). Par exemple :
dir=$PWD
if cd /root 2> /dev/null
then
cd $dir
else
echo "Le répertoire /root n’est pas accessible !"
fi
À noter que l’indentation (le fait de décaler le texte après le then) n’est pas prise en compte par
BASH, le seul but est de rendre la structure plus lisible. Nous pouvons compléter le script avec
également un message si le répertoire est accessible :
dir=$PWD
if cd /root 2> /dev/null
then
echo "Le répertoire /root est accessible !"
cd $dir
else
echo "Le répertoire /root n’est pas accessible !"
fi
Par ailleurs, nous avons vu en cours la notion de « paramètres positionnels », pour rappel il s’agit
d’arguments précisés lors de l’appel du script et accessibles dans le script, ainsi $1 correspond
au premier argument, $2 au second, etc. Dans l’exemple précédent, nous pouvons par exemple
passer en argument le répertoire à tester :
dir=$PWD
if cd "$1" 2> /dev/null
then
echo "Le répertoire $1 est accessible !"
cd $dir
else
echo "Le répertoire $1 n’est pas accessible !"
fi
Enfin, notons que plutôt qu’aller à la ligne nous pouvons enchaîner les commandes sur une même
ligne avec « ; » mais ce n’est pas conseillé lorsqu’on débute en BASH ! Par exemple :
dir=$PWD
if cd "$1" 2> /dev/null ; then echo "Le répertoire $1 est accessible !" ; cd $dir
else echo "Le répertoire $1 n’est pas accessible !" ; fi
test $age -ge 7 && echo "vous êtes assez grand pour lire Tintin"
if test $age -ge 7 ; then echo "vous êtes assez grand pour lire Tintin" ; fi
2
Afin de rendre les scripts plus lisibles – notamment pour un habitué des langages de program-
mation classiques – une syntaxe originale de la commande test est de n’écrire que son argument
encadré par des crochets, par exemple :
[ $age -ge 7 ] && echo "vous êtes assez grand pour lire Tintin"
if [ $age -ge 7 ] ; then echo "vous êtes assez grand pour lire Tintin" ; fi
À faire :
1. lire intégralement le man de test (pour rappel en tapant « man test ») ;
2. déclarer une variable age et lui affecter une valeur (par exemple « age=8 ») ;
3. tester les 4 lignes précédentes (ne pas hésiter à copier-coller) ;
4. recommencer avec d’autres valeurs pour age.
Il est évidemment possible d’utiliser des expressions plus complexes en utilisant les trois opéra-
teurs de base de la logique booléenne (« et » (-a), « ou » (-o) et « non » (!)), par exemple :
[ $age -ge 7 -a $age -le 77 ] && echo "vous avez l’âge de lire Tintin"
Vous vous demandez sans doute pourquoi « $age -ge 7 » et non simplement « $age >= 7 »
comme dans l’exemple Python donné au début de la fiche ? C’est une conséquence de l’absence
de typage, en effet pour le BASH toutes les variables sont des chaînes de caractères, dès lors il
faut un opérateur particulier pour spécifier qu’il faut traiter le contenu comme un entier. Les
opérateurs possibles sont -eq pour « equal », -ne pour « not equal », -lt pour « less than », -le
pour « less or equal », -gt pour « greater than » et -ge pour « greater or equal ».
Il existe de plus de nombreux tests possibles sur les fichiers et répertoires, par exemple l’opérateur
unaire « -d » teste si un répertoire existe :
3
Les opérateurs de comparaison principaux sur les chaînes sont :
[ chaîne1 == chaîne2 ] True si les deux chaînes sont identiques ;
[ chaîne1 != chaîne2 ] True si les deux chaînes sont différentes ;
[ chaîne1 < chaîne2 ] True si chaîne1 est alphabétiquement avant chaîne2 ;
[ chaîne1 > chaîne2 ] True si chaîne1 est alphabétiquement après chaîne2 ;
et il est aussi possible de tester si une chaîne est vide :
[ -z chaîne ] True si la chaîne chaîne est vide ;
[ -n chaîne ] True si la chaîne chaîne n’est pas vide.
À faire :
1. donner une ligne de commandes qui affiche un message si on est en 2023, une solution
possible est proposée section 6.2 ;
2. proposer un script qui affiche le titre du roman dans lequel le mot « ballon » apparaît
plus souvent, entre « De la Terre à la Lune » et « Le tour du monde en 80 jours » ; les
fichiers étant disponibles respectivement aux URL suivantes :
https://www.gutenberg.org/files/799/799-0.txt,
https://www.gutenberg.org/cache/epub/800/pg800.txt,
une solution est disponible section 6.3.
4 Pattern matching
Une alternative aux crochets est l’usage de doubles crochets ; le principal intérêt est l’utilisation
d’expressions plus complexes lors de la comparaison de chaînes de caractères, par exemple l’étoile
(*) équivaut à une suite de caractères quelconques (une suite éventuellement vide), le point
d’interrogation (?) représente un et un seul caractère quelconque, etc. On parle de « pattern
matching » ce qui en français pourrait se traduire par « mise en correspondance de formes ».
À faire : tester [[ $(date) == *2023* ]] && echo "on est en 2023" ;
voir section 6.4 si vous n’avez pas de machine pour tester (par exemple si vous révisez chez vous).
À tester :
toto="/home/jlpicard/mission.txt" ; IFS="/" ; echo "$toto" (solution section 6.4) ;
4
toto="/home/jlpicard/mission.txt" ; IFS="/" ; echo $toto (solution section 6.4) ;
toto="Title: De la Terre à la Lune" ; IFS=":" ; set $toto ; echo $2 (voir 6.4).
Attention, le « word spliting » est uniquement lié à l’expansion de variables ; à tester :
IFS=":" ; set Title: De la Terre à la Lune ; echo $2 (solution section 6.4).
6 Solutions
6.1 Solution pour la commande testacces
if [ -x $1 ]
then echo "Le répertoire $1 est accessible !"
else echo "Le répertoire $1 n’est pas accessible !"
fi
date | grep -q 2023 && echo "on est bien en 2023 !"