Dans le code ci-dessous lorsque je donne l'option r
puis getopts
nécessite un argument :
while getopts ":hr::l:" opt; do
case $opt in
r ) echo "Run Numbers - argument = $OPTARG " ;;
l ) echo "Latency range - argument = $OPTARG" ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
Mais je dois passer deux arguments après -r
option, au lieu d'une. Existe-t-il un moyen simple de le faire ?
Réponse acceptée :
Vous ne pouvez pas passer deux arguments avec une seule option en utilisant getopts
.
Je recommande les alternatives suivantes :
-
Mettre des guillemets autour de plusieurs arguments
Dans ce cas, getopts les traitera comme un seul argument, mais vous pourrez le diviser plus tard. Vous pouvez même mettre tous les arguments dans le tableau à la fois :
#!/bin/bash while getopts ":hr:l:" opt; do case $opt in r ) echo "Run Numbers - argument = $OPTARG " set -f # disable glob IFS=' ' # split on space characters array=($OPTARG) ;; # use the split+glob operator l ) echo "Latency range - argument = $OPTARG" ;; h ) helptext graceful_exit ;; * ) usage clean_up exit 1 esac done echo "Number of arguments: ${#array[@]}" echo -n "Arguments are:" for i in "${array[@]}"; do echo -n " ${i}," done printf "b n"
L'exemple de run :
./script -r "123 456 789"
Et sortie :
Run Numbers - argument = 123 456 789 Number of arguments: 3 Arguments are: 123, 456, 789
-
Utilisez une virgule (ou tout autre caractère préféré) comme délimiteur
./script -r 123,456,789
et vous remplacez simplement
IFS=" "
avecIFS=,
dans le code ci-dessus. Celui-ci a l'avantage d'autoriser les éléments vides.
Comme indiqué dans la section des commentaires, cette solution est choisie par certains programmes courants, par ex.lsblk -o NAME,FSTYPE,SIZE
. -
Autoriser plusieurs
-r
choixPlusieurs
-r
, mais chacun ne prenant qu'un seul argument :./script -r 123 -r 456 -r 789
Ensuite, les arguments seraient ajoutés au tableau un par un
array+=("$OPTARG")
Celui-ci a l'avantage de ne pas avoir de limitations sur les caractères que les éléments peuvent contenir.
Celui-ci est également utilisé par certains outils Linux standard, par ex.awk -v var1=x -v var2=y
.