Nel codice sottostante quando do l'opzione r
quindi getopts
richiede un argomento:
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
Ma ho bisogno di passare due argomenti dopo -r
opzione, invece di una. C'è un modo semplice per farlo?
Risposta accettata:
Non puoi passare due argomenti con una singola opzione usando getopts
.
Consiglio le seguenti alternative:
-
Metti tra virgolette più argomenti
In questo caso getopts li tratterà come un argomento, ma potrai dividerlo in un secondo momento. Puoi anche inserire tutti gli argomenti nell'array contemporaneamente:
#!/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'esempio di eseguire:
./script -r "123 456 789"
E uscita:
Run Numbers - argument = 123 456 789 Number of arguments: 3 Arguments are: 123, 456, 789
-
Utilizza la virgola (o altro carattere preferito) come delimitatore
./script -r 123,456,789
e sostituisci semplicemente
IFS=" "
conIFS=,
nel codice sopra. Quello ha il vantaggio di consentire elementi vuoti.
Come sottolineato nella sezione commenti questa soluzione è scelta da alcuni programmi comuni ad es.lsblk -o NAME,FSTYPE,SIZE
. -
Consenti
-r
multipli opzioni-r
multipli , ma ognuno con un solo argomento:./script -r 123 -r 456 -r 789
Quindi gli argomenti verrebbero aggiunti all'array uno per uno
array+=("$OPTARG")
Quello ha il vantaggio di non avere limitazioni su quali caratteri possono contenere gli elementi.
Questo è usato anche da alcuni strumenti linux standard, ad es.awk -v var1=x -v var2=y
.