Im folgenden Code, wenn ich die Option r
gebe dann getopts
erfordert ein 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
Aber ich muss zwei Argumente nach -r
übergeben Option, statt einer. Gibt es eine einfache Möglichkeit, dies zu tun?
Akzeptierte Antwort:
Sie können mit getopts
nicht zwei Argumente mit einer einzigen Option übergeben .
Ich empfehle folgende Alternativen:
-
Setzen Sie mehrere Argumente in Anführungszeichen
In diesem Fall behandelt getopts sie als ein Argument, aber Sie können es später aufteilen. Sie können sogar alle Argumente auf einmal in das Array einfügen:
#!/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"
Das Beispiel von run:
./script -r "123 456 789"
Und Ausgabe:
Run Numbers - argument = 123 456 789 Number of arguments: 3 Arguments are: 123, 456, 789
-
Komma (oder ein anderes bevorzugtes Zeichen) als Trennzeichen verwenden
./script -r 123,456,789
und Sie ersetzen einfach
IFS=" "
mitIFS=,
im Code oben. Das hat den Vorteil, leere Elemente zuzulassen.
Wie im Kommentarbereich erwähnt, wird diese Lösung von einigen gängigen Programmen gewählt, z.lsblk -o NAME,FSTYPE,SIZE
. -
Mehrere
-r
zulassen OptionenMehrere
-r
, aber jeweils nur ein Argument:./script -r 123 -r 456 -r 789
Dann würden die Argumente nacheinander zum Array hinzugefügt
array+=("$OPTARG")
Das hat den Vorteil, dass es keine Einschränkungen gibt, welche Zeichen die Elemente enthalten dürfen.
Dieses wird auch von einigen Standard-Linux-Tools verwendet, z.awk -v var1=x -v var2=y
.