V níže uvedeném kódu, když dám možnost r
pak getopts
vyžaduje jeden 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
Ale musím předat dva argumenty za -r
možnost místo jedné. Existuje snadný způsob, jak to udělat?
Přijatá odpověď:
Nemůžete předat dva argumenty s jednou možností pomocí getopts
.
Doporučuji následující alternativy:
-
Uveďte několik argumentů do uvozovek
V tomto případě je getopts bude považovat za jeden argument, ale později jej budete moci rozdělit. Můžete dokonce vložit všechny argumenty do pole najednou:
#!/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"
Příklad spuštění:
./script -r "123 456 789"
A výstup:
Run Numbers - argument = 123 456 789 Number of arguments: 3 Arguments are: 123, 456, 789
-
Jako oddělovač použijte čárku (nebo jiný preferovaný znak)
./script -r 123,456,789
a stačí nahradit
IFS=" "
sIFS=,
v kódu výše. To má výhodu v tom, že umožňuje prázdné prvky.
Jak bylo uvedeno v sekci komentářů, toto řešení volí některé běžné programy, např.lsblk -o NAME,FSTYPE,SIZE
. -
Povolit více
-r
možnostiVíce
-r
, ale každý má pouze jeden argument:./script -r 123 -r 456 -r 789
Potom by se argumenty přidávaly do pole jeden po druhém
array+=("$OPTARG")
Ten má výhodu v tom, že nemá omezení na to, jaké znaky mohou prvky obsahovat.
Toto je také používáno některými standardními linuxovými nástroji, např.awk -v var1=x -v var2=y
.