Você não pode passar dois argumentos com uma única opção usando getopts
.
Eu recomendo as seguintes alternativas:
-
Coloque aspas em vários argumentos
Neste caso, getopts os tratará como um argumento, mas você poderá dividi-lo mais tarde. Você pode até colocar todos os argumentos no array de uma só vez:
#!/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"
O exemplo de execução:
./script -r "123 456 789"
E saída:
Run Numbers - argument = 123 456 789 Number of arguments: 3 Arguments are: 123, 456, 789
-
Use vírgula (ou outro caractere preferido) como um delimitador
./script -r 123,456,789
e você acabou de substituir
IFS=" "
porIFS=,
no código acima. Esse tem a vantagem de permitir elementos vazios. Como salientado na secção de comentários, esta solução é escolhida por alguns programas comuns, e.lsblk -o NAME,FSTYPE,SIZE
. -
Permitir várias opções
-r
Múltiplos
-r
, mas cada um usando apenas um argumento:./script -r 123 -r 456 -r 789
Em seguida, os argumentos seriam adicionados ao array, um por um
array+=("$OPTARG")
Esse tem a vantagem de não ter limitações sobre quais caracteres os elementos podem conter. Este também é utilizado por algumas ferramentas padrão do Linux, por ex.
awk -v var1=x -v var2=y
.