Pesquisa de site

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.

Artigos relacionados: