Eu uso getopts para analisar argumentos em scripts bash como
while getopts ":hd:" opt; do
case $opt in
d ) echo "directory = $OPTARG"; mydir="$OPTARG"; shift $((OPTIND-1)); OPTIND=1 ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
exeparams="$*"
exeparams
manterá quaisquer opções / argumentos não analisados. Como desejo usar exeparams para conter opções para que um comando seja executado dentro do script (que pode se sobrepor às próprias opções do script), eu quero usar - para finalizar as opções passadas para o script. Se eu passar por exemplo
myscript -d myscriptparam -- -d internalparam
exeparams
vai segurar
-- -d internalparam
Agora eu quero remover o líder --
para passar esses argumentos para o comando interno. Existe uma maneira elegante de fazer isso ou posso obter uma string que retenha apenas o restante sem --
getopts?
shift; OPTIND=1
dentro dogetopts
loop provavelmente não é a melhor maneira de fazê-lo. Isso só funciona no seu caso, porque você tem apenas 2 opções e, nos demais, apenas sai do script. Caso contrário, você precisariashift; OPTIND=1
de todas as opções, o que significa código duplicado (prática recomendada). Basta fazer umshift $((OPTIND - 1))
imediatamente após o final do loop - esta é a maneira mais convencional e provavelmente a mais eficiente também.