Como incluir opções em seus scripts de shell Bash
Dê opções aos seus scripts de shell.
Os comandos de terminal geralmente têm opções ou opções, que você pode usar para modificar a forma como o comando faz o que faz. As opções estão incluídas na especificação POSIX para interfaces de linha de comando. É também uma convenção consagrada estabelecida com os primeiros aplicativos UNIX, por isso é bom saber como incluí-los em seus scripts Bash ao criar seus próprios comandos.
Tal como acontece com a maioria das linguagens, existem várias maneiras de resolver o problema de análise de opções no Bash. Até hoje, meu método favorito continua sendo aquele que aprendi com os scripts de construção do Slackware de Patrick Volkerding, que serviu como minha introdução ao shell script quando descobri o Linux e ousei me aventurar nos arquivos de texto simples que acompanham o sistema operacional.
Análise de opções no Bash
A estratégia para analisar opções no Bash é percorrer todos os argumentos passados para o seu script de shell, determinar se eles são uma opção ou não e, em seguida, passar para o próximo argumento. Repita esse processo até que não restem mais opções.
Comece com uma opção booleana simples (às vezes chamada de switch ou flag):
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done
echo $ALPHA
Neste código, eu crio um loop while
que serve como um loop infinito até que não haja mais argumentos para processar. Uma instrução if
tenta corresponder qualquer argumento encontrado na primeira posição ($1
) para --alpha
ou -a
. (Esses são nomes de opções arbitrários sem nenhum significado especial. Em um script real, você pode usar --verbose
e -v
para acionar a saída detalhada).
A palavra-chave shift
faz com que todos os argumentos sejam deslocados em 1, de modo que um argumento na posição 2 ($2
) seja movido para a posição 1 ($1
) . A instrução else
é acionada quando não há mais argumentos para processar, o que interrompe o loop while
.
No final do script, o valor de $ALPHA
é impresso no terminal.
Teste o roteiro:
$ bash ./test.sh --alpha
1
$ bash ./test.sh
$ bash ./test.sh -a
1
A opção foi detectada corretamente.
Detectando argumentos no Bash
Porém, há um problema: argumentos extras são ignorados.
$ bash ./test.sh --alpha foo
1
$
Para capturar argumentos que não são opções, você pode despejar os argumentos restantes em um array Bash.
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done
echo $ALPHA
ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
Teste a nova versão do script:
$ bash ./test.sh --alpha foo
1
foo
$ bash ./test.sh foo
foo
$ bash ./test.sh --alpha foo bar
1
foo
bar
Opções com argumentos
Algumas opções exigem um argumento próprio. Por exemplo, você pode permitir que o usuário defina um atributo como a cor ou a resolução de um gráfico ou aponte seu aplicativo para um arquivo de configuração personalizado.
Para implementar isso no Bash, você pode usar a palavra-chave shift
como faz com opções booleanas, mas deslocar os argumentos por 2 em vez de 1.
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
CONFIG=$2
shift 2
else
break
fi
done
echo $ALPHA
echo $CONFIG
ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
Neste código, adiciono uma cláusula elif
para comparar cada argumento com --config
e -c
. No caso de uma correspondência, o valor de uma variável chamada CONFIG
é definido para o valor de qualquer que seja o segundo argumento (isso significa que a opção --config
requer um argumento). Todos os argumentos mudam de lugar em 2: 1 para mudar --config
ou -c
, e 1 para mover seu argumento. Como de costume, o loop se repete até que não restem argumentos correspondentes.
Aqui está um teste da nova versão do script:
$ bash ./test.sh --config my.conf foo bar
my.conf
foo
bar
$ bash ./test.sh -a --config my.conf baz
1
my.conf
baz
Análise de opções facilitada
Existem outras maneiras de analisar opções no Bash. Você pode alternativamente usar uma instrução case
ou o comando getopt
. Independentemente do que você escolher usar, as opções para seus usuários são recursos importantes para qualquer aplicativo, e o Bash facilita isso.