Comment inclure des options dans vos scripts shell Bash

Les commandes de terminal ont 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. C’est aussi 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 avec 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 des 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 en texte brut fournis avec le système d’exploitation.
Contents
Analyse des options dans Bash
La stratégie d’analyse des options dans Bash consiste à parcourir tous les arguments passés à 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 changer ou un drapeau):
#!/bin/bashwhile [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
doneecho $ALPHA
Dans ce code, je crée un while
boucle qui sert de boucle infinie jusqu’à ce qu’il n’y ait plus d’arguments à traiter. Un if
L’instruction tente de faire correspondre n’importe quel argument trouvé en première position ($1
) soit --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 verbeuse).
Les shift
le mot-clé fait décaler tous les arguments de 1, de sorte qu’un argument en position 2 ($2
) est déplacé en position 1 ($1
). Les else
L’instruction est déclenchée lorsqu’il n’y a plus d’arguments à traiter, ce qui rompt le while
boucle.
A la fin du script, la valeur de $ALPHA
est imprimé 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étecter les arguments dans Bash
Il y a cependant un problème : les arguments supplémentaires sont ignorés.
$ bash ./test.sh --alpha foo
1
$
Pour intercepter les arguments qui ne sont pas destinés à être des options, vous pouvez vider les arguments restants dans un tableau Bash.
#!/bin/bashwhile [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
doneecho $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 foofoo
$ bash ./test.sh --alpha foo bar
1
foo
bar
Options avec arguments
Certaines options nécessitent un argument qui leur est propre. Par exemple, vous pouvez autoriser l’utilisateur à définir un attribut tel qu’une couleur ou la résolution d’un graphique ou à faire pointer votre application vers un fichier de configuration personnalisé.
Pour implémenter cela dans Bash, vous pouvez utiliser le shift
comme vous le faites avec les commutateurs booléens mais décalez les arguments de 2 au lieu de 1.
#!/bin/bashwhile [ 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
doneecho $ALPHA
echo $CONFIGARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
Dans ce code, j’ajoute un elif
clause pour comparer chaque argument aux deux --config
et -c
. En cas de correspondance, la valeur d’une variable appelée CONFIG
est défini sur la valeur du second argument (cela signifie que le --config
l’option nécessite un argument). Tous les arguments se décalent de 2: 1 pour se 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 aucun argument correspondant.
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 un case
déclaration ou le getopt
commander. Quoi que vous choisissiez d’utiliser, les options pour vos utilisateurs sont des fonctionnalités importantes pour toute application, et Bash vous facilite la tâche.