Comment inclure des options dans vos scripts shell Bash
Donnez des options à vos scripts shell.
Les commandes de terminal comportent généralement des options ou des commutateurs que vous pouvez utiliser pour modifier la façon dont la commande fait ce qu'elle fait. Les options sont incluses dans la spécification POSIX pour les interfaces de ligne de commande. Il s'agit également d'une convention séculaire établie avec les premières applications UNIX. Il est donc bon de savoir comment les inclure dans vos scripts Bash lorsque vous créez vos propres commandes.
Comme dans la plupart des langages, il existe plusieurs façons de résoudre le problème des options d’analyse dans Bash. À ce jour, ma méthode préférée reste celle que j'ai apprise grâce aux scripts de construction Slackware de Patrick Volkerding, qui m'ont servi d'introduction aux scripts shell lorsque j'ai découvert Linux pour la première fois et que j'ai osé m'aventurer dans les fichiers de texte brut fournis avec le système d'exploitation.
Analyse des options dans Bash
La stratégie d'analyse des options dans Bash consiste à parcourir tous les arguments transmis à votre script shell, à déterminer s'il s'agit d'une option ou non, puis à passer à l'argument suivant. Répétez ce processus jusqu'à ce qu'il ne reste plus d'options.
Commencez par une simple option booléenne (parfois appelée switch ou drapeau) :
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done
echo $ALPHA
Dans ce code, je crée une boucle while
qui sert de boucle infinie jusqu'à ce qu'il n'y ait plus d'arguments à traiter. Une instruction if
tente de faire correspondre l'argument trouvé en première position ($1
) à --alpha
ou -a
. (Ce sont des noms d'options arbitraires sans signification particulière. Dans un script réel, vous pouvez utiliser --verbose
et -v
pour déclencher une sortie détaillée).
Le mot-clé shift
fait décaler tous les arguments de 1, de sorte qu'un argument en position 2 ($2
) soit déplacé en position 1 ($1
). . L'instruction else
est déclenchée lorsqu'il n'y a plus d'arguments à traiter, ce qui interrompt la boucle while
.
A la fin du script, la valeur de $ALPHA
est imprimée sur le terminal.
Testez le script :
$ bash ./test.sh --alpha
1
$ bash ./test.sh
$ bash ./test.sh -a
1
L'option est correctement détectée.
Détection des arguments dans Bash
Il y a cependant un problème : les arguments supplémentaires sont ignorés.
$ bash ./test.sh --alpha foo
1
$
Pour récupérer les arguments qui ne sont pas destinés à être des options, vous pouvez transférer les arguments restants dans un tableau Bash.
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done
echo $ALPHA
ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
Testez la nouvelle version du script :
$ bash ./test.sh --alpha foo
1
foo
$ bash ./test.sh foo
foo
$ bash ./test.sh --alpha foo bar
1
foo
bar
Options avec arguments
Certaines options nécessitent leur propre argument. Par exemple, vous souhaiterez peut-être autoriser l'utilisateur à définir un attribut tel qu'une couleur ou la résolution d'un graphique ou à pointer votre application vers un fichier de configuration personnalisé.
Pour implémenter cela dans Bash, vous pouvez utiliser le mot-clé shift
comme vous le faites avec les commutateurs booléens mais décalez les arguments de 2 au lieu de 1.
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
CONFIG=$2
shift 2
else
break
fi
done
echo $ALPHA
echo $CONFIG
ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
Dans ce code, j'ajoute une clause elif
pour comparer chaque argument à la fois à --config
et à -c
. En cas de correspondance, la valeur d'une variable appelée CONFIG
est définie sur la valeur du deuxième argument (cela signifie que l'option --config
nécessite un argument). Tous les arguments se décalent de 2 : 1 pour décaler --config
ou -c
, et 1 pour déplacer son argument. Comme d'habitude, la boucle se répète jusqu'à ce qu'il ne reste plus d'arguments correspondants.
Voici un test de la nouvelle version du script :
$ bash ./test.sh --config my.conf foo bar
my.conf
foo
bar
$ bash ./test.sh -a --config my.conf baz
1
my.conf
baz
L'analyse des options simplifiée
Il existe d'autres façons d'analyser les options dans Bash. Vous pouvez alternativement utiliser une instruction case
ou la commande getopt
. Quoi que vous choisissiez d'utiliser, les options destinées à vos utilisateurs sont des fonctionnalités importantes pour toute application, et Bash facilite la tâche.