Question 1Qu'est-ce qui entre dans $2 quand tu exécutes ./a.sh foo bar ?
Script Shell - Arguments et codes de sortie
Récupère les valeurs de ./a.sh foo bar avec $1 $2 $@ $# $0, fournis un défaut avec ${2:--}, vérifie $? et renvoie succès ou échec avec exit 0 / exit 1 — écris et exécute un script pratique, illustré dans un terminal en navigateur.
Récupérer les arguments — $1 / $2 / $0
Les scripts peuvent recevoir des valeurs quand tu les exécutes.
Les valeurs que tu listes après la commande, comme ./a.sh foo bar, sont appelées des arguments, et dans le script $1 est le premier et $2 le deuxième.
$0 est le nom du script lui-même, $# est le nombre d'arguments passés, et $@ représente tous les arguments ensemble.
Grâce à eux, tu peux exécuter le script avec une entrée différente à chaque fois au lieu de valeurs fixes.
| Syntaxe | Signification | Exemple |
|---|---|---|
$1 $2 | Premier et deuxième arguments | echo "$1 then $2" |
$0 | Le nom du script lui-même | echo "running $0" |
$# | Nombre d'arguments passés | echo "argc=$#" |
$@ | Tous les arguments ensemble | echo "all: $@" |
$1 $2 ; $# donne le nombre et $@ l'ensemble complet.set -- foo bar # définit les paramètres positionnels pour la démo
echo "1st: $1" # foo
echo "2nd: $2" # bar
echo "argc: $#" # 2
echo "all: $@" # foo bar
Fournir un défaut — ${1:-def}
Parfois aucun argument n'est passé.
Si tu écris ${1:-default}, default est utilisé quand $1 n'est pas défini ou est vide, et la valeur fournie est utilisée quand il y en a une.
Cela te permet d'écrire un script qui suit l'argument quand il est fourni, et fonctionne avec un défaut sûr quand il ne l'est pas.
Vérifier $# te dit aussi si le nombre attendu d'arguments est bien arrivé.
| Syntaxe | Signification | Exemple |
|---|---|---|
${1:-def} | Utilise def quand $1 n'est pas défini | name=${1:-guest} |
${2:-def} | Utilise def quand $2 n'est pas défini | sep=${2:--} |
${2:--}, passer une deuxième valeur l'utilise, et l'omettre utilise le défaut -.set -- # reproduit une exécution sans argument
echo "${1:-guest}" # non défini, donc guest
set -- alice # maintenant le premier argument est défini
echo "${1:-guest}" # a une valeur, donc alice
Renvoyer succès ou échec — $? et exit N
Quand une commande se termine, elle renvoie un code de sortie, un nombre de 0 à 255.
Par convention 0 signifie succès et tout autre que 0 signifie échec.
Tu peux lire le code de sortie de la commande précédente avec $?.
Pour grep c'est 0 quand c'est trouvé et 1 quand ça ne l'est pas, donc la valeur change selon le résultat.
Depuis l'intérieur d'un script, tu définis le code de sortie explicitement avec exit N.
Renvoyer exit 0 pour le succès et exit 1 pour l'échec est la convention courante.
L'appelant reçoit cette valeur via $? ou && || et peut l'utiliser pour le contrôle, par exemple avancer seulement en cas de succès.
Si tu omets exit, le code de sortie de la dernière commande exécutée est renvoyé tel quel.
| Syntaxe | Signification | Exemple |
|---|---|---|
$? | Code de sortie de la commande précédente | grep x f; echo $? |
exit N | Termine le script avec le code de sortie N | exit 1 |
exit 0 en cas de succès et exit 1 en cas d'échec, et l'appelant lit le résultat avec $?.printf 'apple\nbanana\n' > fruits.txt # crée le matériel
grep apple fruits.txt > /dev/null
echo "found? $?" # trouvé, donc 0
grep mango fruits.txt > /dev/null
echo "found? $?" # non trouvé, donc 1
Traiter chaque argument à tour de rôle — $@ et $#
Quand le nombre d'arguments n'est pas fixe, au lieu d'écrire $1 $2 un par un, parcours $@ avec for pour en traiter autant qu'il en a été passé.
La forme for x in "$@"; do … done les prend un à la fois, et afficher le nombre avec $# permet au même script de gérer n'importe quel nombre d'arguments.
C'est un motif courant dans les outils qui traitent plusieurs fichiers ensemble.
| Syntaxe | Signification | Exemple |
|---|---|---|
"$@" | Passe chaque argument un mot à la fois (pour for ; nécessite des guillemets doubles) | for x in "$@"; do |
$# | Nombre d'arguments passés | echo "count=$#" |
$#, puis prends chaque argument un à la fois avec $@ dans une boucle for pour les traiter.set -- foo bar baz # définit les paramètres positionnels pour la démo
echo "argc: $#" # 3
for x in "$@"; do
echo "- $x" # - foo / - bar / - baz
done
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Quelle est la bonne signification de ${1:-guest} ?
Question 3Lequel lit le code de sortie qui indique si la commande précédente a réussi ?