Dans le code ci-dessous lorsque je donne l'option r
alors 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'un. Y a-t-il un moyen facile de faire ceci?
Vous ne pouvez pas passer deux arguments avec une seule option à l'aide de getopts
.
Je recommande les alternatives suivantes:
Dans ce cas, getopts les traitera comme un argument, mais vous pourrez la 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 course:
./script -r "123 456 789"
Et sortie:
Run Numbers - argument = 123 456 789
Number of arguments: 3
Arguments are: 123, 456, 789
./script -r 123,456,789
et vous venez de remplacer IFS=" "
avec IFS=,
Dans le code ci-dessus. Celui-ci a l'avantage de permettre des éléments vides. Comme indiqué dans la section Commentaires, cette solution est choisie par certains programmes communs par exemple. lsblk -o NAME,FSTYPE,SIZE
.
-r
optionsPlusieurs -r
, mais chacun ne prend qu'un argument:
./script -r 123 -r 456 -r 789
Ensuite, des 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. awk -v var1=x -v var2=y
.