Achetez ce tutoriel sur les scripts Shell en PDF pour seulement 5 $
Test est utilisé par pratiquement tous les scripts shell écrits. Cela peut ne pas sembler ainsi, cartest
n’est pas souvent appelé directement. test
est plus fréquemment appelé comme
if SPACE
Test is a simple but powerful comparison utility. For full details, run man test
sur votre système, mais voici quelques usages et exemples typiques.
Test est le plus souvent invoqué indirectement via les instructions if
etwhile
. C'est aussi la raison pour laquelle vous rencontrerez des difficultés si vous créez un programme appelé test
et essayez de l'exécuter, car ce builtin shell sera appelé au lieu de votreprogramme !
La syntaxe pour if...then...else...
est:
if then # if-codeelse # else-codefi
if ; then # do somethingfi
Vous pouvez aussi utiliser le elif
, comme ceci:
if ; then echo "Something" elif ; then echo "Something else" else echo "None of the above"fi
Essayez le bout de code suivant, avant de l'exécuter définissez la variable X à différentes valeurs (essayez -1, 0, 1, hello, bye, etc). Vous pouvez le faire comme suit (merci à Dave d'avoir souligné la nécessité d'exporter la variable, comme indiqué dansVariables - Partie I.):
$ X=5$ export X$ ./test.sh ... output of test.sh ...$ X=hello$ ./test.sh ... output of test.sh ...$ X=test.sh$ ./test.sh ... output of test.sh ...
Puis essayez à nouveau, avec $X
comme nom d'un fichier existant, tel que /etc/hosts
.
test.sh
Notez que nous pouvons utiliser le point-virgule (;
) pour joindre deux lignes ensemble. Cela est souvent fait pour économiser un peu d'espace dans de simples déclarations if
.
La barre oblique inverse (\
) sert un objectif similaire, mais opposé : elle indique au shell que ce n'est pas la fin de la ligne, mais que la ligne suivante doit être traitée comme faisant partie de la ligne actuelle. Ceci est utile pour la lisibilité. Il est d'usage d'indenter la ligne suivante après une barre oblique inverse (\
) ou un point-virgule (;
).
Par exemple, le point-virgule (;
) est souvent utilisé comme ceci pour joindre les mots-clés if
et then
:
if ; then echo "X is a file which is newer than /etc/passwd"fi
alors que la barre oblique inverse (\
) est utilisée pour diviser la commande à une ligne sur deux lignes dans le fichier de script shell, à des fins de lisibilité :
&& \ echo "X is a file which is newer than /etc/passwd"
Comme nous le voyons dans ces exemples, test
peut effectuer de nombreux tests sur des nombres, des chaînes de caractères et des noms de fichiers.
Il existe une façon plus simple d'écrire les instructions if
: Les commandes &&
et ||
donnent du code à exécuter si le résultat est vrai, ou faux, respectivement.
Cette syntaxe est possible parce qu'il existe un fichier (ou un shell-builtin) appelé La construction est recommandée pour les boucles while et les sanitychecks triviaux avec lesquels vous ne voulez pas trop distraire le lecteur.
Notez que lorsque vous définissez X à une valeur non numérique, les premières comparaisons donnent lieu au message suivant :
Ceci est dû au fait que les comparaisons -lt, -gt, -le et -ge sont uniquement conçues pour les entiers, et ne fonctionnent pas sur les chaînes de caractères. Les comparaisons de chaînes de caractères, telles que !=
traiteront volontiers "5" comme une chaîne de caractères, mais il n'y a pas de moyen raisonnable de traiter "Hello" comme un nombre entier, donc les comparaisons d'entiers se plaignent.
Si vous voulez que votre script shell se comporte plus gracieusement, vous devrez vérifier le contenu de la variable avant de la tester - peut-être quelque chose comme ceci :
De cette façon, vous pouvez echo
un message plus significatif à l'utilisateur, et sortir gracieusement. La variable $?
est expliquée dans Variables - Partie II, et grep
est une bête compliquée, alors voici : grep
trouve les lignes de texte qui contiennent des chiffres (0-9) et éventuellement d'autres caractères, donc le caret (^
) dans grep
ne trouve que les lignes qui ne sont pas composées uniquement de chiffres. Nous pouvons alors prendre le contre-pied (en agissant sur l'échec et non sur le succès). D'accord ? Le >/dev/null 2>&1
dirige toute sortie ou erreur vers le périphérique spécial "null", au lieu d'aller sur l'écran de l'utilisateur.
Merci à Paul Schermerhorn de m'avoir corrigé - cette page prétendait que grep -v
fonctionnerait, mais c'est clairement beaucoup trop simpliste.
Nous pouvons utiliser test dans des boucles while comme suit:
test2.sh
#!/bin/shX=0while do echo "Enter some text (RETURN to quit)" read X echo "You said: $X"done
Ce code continuera à demander une entrée jusqu'à ce que vous appuyiez sur RETURN (X est de longueur zéro).Merci à Justin Heath d'avoir signalé que le script ne fonctionnait pas - j'avais oublié les guillemets autour de $X dans le while
. Sans ces guillemets, il n'y a rien à tester lorsque $X est vide.
Alexander Weber a fait remarquer que l'exécution de ce script se terminera de manière peu soignée:
Cela peut être arrangé avec un autre test dans la boucle:
#!/bin/shX=0while do echo "Enter some text (RETURN to quit)" read X if ; then echo "You said: $X" fidone
Notez également que j'ai utilisé deux syntaxes différentes pour les déclarations if
sur cette page. Ce sont :
if then echo "X is less than zero"fi.......... and ........if ; then echo "You said: $X"fi
Vous devez avoir une rupture entre l'instruction if
et la construction then
. Cela peut être un point-virgule ou un saut de ligne, peu importe lequel, mais il doit y avoir l'un ou l'autre entre le if
et le then
.Il serait bien de dire simplement:
if echo "You said: $X"
mais le then
et le fi
sont absolument nécessaires.
Retour : Boucles Suivant : Cas