Je pense que le comportement que vous voulez est une mauvaise idée; Il existe des programmes qui prennent des options avec des arguments optionnels, et ils ne fonctionnent pas comme ce que vous décrivez. Votre approche va probablement dérouter vos utilisateurs; il sera difficile pour d'autres programmes d'interagir avec lui; et cela limitera l'extensibilité future de votre script. (Imaginez que vous voulez ajouter une autre option plus tard. your_script.sh -d -e
passera -e
comme argument à -d
, même si l'utilisateur voulait utiliser -d
sans argument et destiné -e
comme option séparée.) Et il est particulièrement bizarre d'attendre un argument si c'est sur la ligne de commande, mais deux arguments de l'entrée standard.
Cela étant dit. . .
Pour obtenir l'effet d'un argument optionnel, vous pouvez dire getopts
d'être "silencieux" (c'est-à-dire d'utiliser "silent error report") en plaçant un deux-points :
au début de la chaîne d'option . (Par exemple, au lieu de getopts d: ...
, vous écrivez getopts :d: ...
.) Ensuite, quand l'argument d'une option est manquant, il va définir l'option-name à :
(au lieu de d
) et OPTARG
à l'option-name (à savoir d
, au lieu de l'option-argument).
Par exemple, le script ci-dessous peut être appelé soit comme script.sh -d foo
ou script.sh -d
, ce dernier faisant l'utilisateur d'être invité à saisir une valeur:
#!/bin/bash
if getopts :d: arg ; then
if [[ "$arg" == d ]] ; then
d="$OPTARG"
else
read -p 'Enter d: ' d
fi
echo "d is: $d"
else
echo 'no d'
fi
Entraînant:
$ ./script.sh
no d
$ ./script.sh -d
Enter d: x
d is: x
$ ./script.sh -d y
d is: y