Estou tentando executar o seguinte script usando getopts
para analisar as opções, mas não parece funcionar:
#!/bin/bash
set -x
echo $@
while getopts "rf" opt
do
case "${opt}" in
r)
ropt=${OPTARG}
;;
f)
fopt=${OPTARG}
;;
esac
done
shift $((OPTIND -1))
echo $fopt $ropt
A saída que recebo é:
$ ./myscript.sh -f opt2 -r opt1
+ echo -f opt2 -r opt1
-f opt2 -r opt1
+ getopts rf opt
+ case "${opt}" in
+ fopt=
+ getopts rf opt
+ shift 1
+ echo
+ set +x
Você tem alguma ideia do que estou fazendo de errado?
Você espera que suas opções aceitem argumentos de opção, mas não informa
getopts
sobre isso.Você deveria usar
ou seja, cada opção que recebe um argumento deve ter
:
depois na string do argumento paragetopts
.Você provavelmente também desejará uma ramificação padrão
case
no final para lidar com opções inválidas:(a mensagem de erro (sobre opção inválida ou argumento de opção ausente) será exibida
getopts
sozinha,usage
espera-se que seja uma função que você definiu que imprime uma pequena mensagem de ajuda na saída padrão).Além disso, não se esqueça de colocar aspas duplas em todas as expansões, mesmo
$(( OPTIND - 1 ))
.Relacionado a esse último ponto: