Recherche de site Web

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.

Articles connexes: