Estou trabalhando em um script bash e preciso implementar "opções". Como posso fazer isso com o bash?
Meu objetivo é executar o script da seguinte maneira: /myscript.sh -d "/var/log/" -c "test"
o que eu tentei:
while shift; do
case $1 in
-d)
shift&&DIR="$1"||die
;;
-c)
shift&&COMMAND="$1"||die
;;
esac
done
echo "$DIR"
echo "$COMMAND"
Respostas:
Para expandir a resposta da @ choroba, aqui está um exemplo de como usar
getopts
:Note que depois de deslocar os argumentos de bandeira, quaisquer argumentos "regulares" permanecerão. Então, nesse ponto, você pode lidar com eles (por exemplo,
... for arg in "$@"; do ...
) ou se o seu script não os leva a reclamar se você receber algum (if [ $# -gt 0 ]; then echo "Usage ...
).fonte
getopt
é um comando externo, mas estou sugerindogetopts
(note o "s"), que é um shell embutido.Seu erro é que você está mudando no topo do loop, jogando o primeiro argumento antes de examiná-lo. Isso é o que eu acho que você provavelmente quis dizer:
fonte
die
provavelmente era um pseudônimo - ou pelo menos, que o que quer que fosse não importava para a questão.Como a choroba já disse getopts é uma abordagem melhor.
No seu caso, você poderia usar:
para conseguir o que você está tentando fazer com o loop while.
A corda
c:d:
especifica os comutadores possíveis. O cólon significa que o comutador requer um argumento.O problema com a sua abordagem é que você chama
shift
antes de analisar o primeiro argumento, descartando-o no processo.Para corrigir isso, altere o loop while para o seguinte:
fonte
A abordagem usual é usar
getopts
.fonte