
Estou tentando processar argumentos de linha de comando usando getopts
o bash. Um dos requisitos é o processamento de um número arbitrário de argumentos de opção (sem o uso de aspas).
1º exemplo (captura apenas o 1º argumento)
madcap:~/projects$ ./getoptz.sh -s a b c
-s was triggered
Argument: a
2º exemplo (quero que se comporte assim mas sem precisar citar o argumento"
madcap:~/projects$ ./getoptz.sh -s "a b c"
-s was triggered
Argument: a b c
Existe uma maneira de fazer isso?
Aqui está o código que tenho agora:
#!/bin/bash
while getopts ":s:" opt; do
case $opt in
s) echo "-s was triggered" >&2
args="$OPTARG"
echo "Argument: $args"
;;
\?) echo "Invalid option: -$OPTARG" >&2
;;
:) echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
Observe que quero oferecer suporte a vários sinalizadores dessa maneira, por exemplo
madcap:~/projects$ ./getoptz.sh -s a b c -u 1 2 3 4
-s was triggered
Argument: a b c
-u was triggered
Argument: 1 2 3 4
Responder1
Acho que a melhor maneira de fazer isso é usar -s para cada argumento, ou seja -s foo -s bar -s baz
,masse você ainda quiser apoiar vários argumentos para uma única opção, sugiro que vocênãousar getopts
.
Por favor, dê uma olhada no seguinte script:
#!/bin/bash
declare -a sargs=()
read_s_args()
{
while (($#)) && [[ $1 != -* ]]; do sargs+=("$1"); shift; done
}
while (($#)); do
case "$1" in
-s) read_s_args "${@:2}"
esac
shift
done
printf '<%s>' "${sargs[@]}"
Quando -s
está sendo detectado, read_s_args
é invocado com as opções e argumentos restantes na linha de comando. read_s_args
lê seus argumentos até chegar à próxima opção. Argumentos válidos para -s estão sendo armazenados na sargs
matriz.
Aqui está umsaída de amostra:
[rany$] ./script -s foo bar baz -u a b c -s foo1 -j e f g
<foo> <bar> <baz> <foo1>
[rany$]