Une autre façon de procéder consiste à nommer le paramètre que vous souhaitez déclarer, puis à le faire:
{ cat >./foo
chmod +x ./foo
eight=declared ./foo
eight=declared_and_preferred \
./foo 1 2 3 4 5 6 7 8
./foo 1 2 3 4 5 6 7 8
./foo
} <<\SCRIPT
#!/usr/bin/sh
: ${eight:=${8:-some_default}}
printf '$eight = %s\n' "$eight"
#END
SCRIPT
PRODUCTION
$eight = declared
$eight = declared_and_preferred
$eight = 8
$eight = some_default
Dans l'exemple ci-dessus, la variable d'environnement explicitement déclarée est préférée à l'argument de ligne de commande, mais l'argument de ligne de commande est utilisé lorsque la variable d'environnement est vide ou non définie. Lorsque la 8e positionnelle et la variable d'environnement $eight
sont vides ou non définies, la valeur par défaut à some_default est affectée $eight
. Dans les deux cas, le :
peut être supprimé des instructions :-
or :=
si vide doit être une valeur acceptable.
La variable $eight
aurait également pu être définie comme:
printf '$eight = %s\n' "${eight:=${8:-some_default}}"
... et la ligne précédente a été entièrement omise, mais je voulais démontrer que déclarer une variable de cette manière entraîne une valeur persistante, et je l'ai donc fait en deux commandes. Dans les deux cas, $eight
la valeur finale de l'expansion du paramètre composé est définie.
getopts
- pour les scripts robustes - est souvent le meilleur moyen de gérer les options de commande . Les paramètres de position, en revanche, sont presque toujours le moyen le plus simple de gérer de manière robuste les opérandes dans un script.
Par exemple:
touch file$(seq -ws\ file 100)
./foo *
PRODUCTION
$eight = file008
Là, nous ne voyons que le huitième opérande, mais il y en a 101 globulés dans mon répertoire de test.