Emitir comandos com opções determinadas por condição

2

Estou tentando fazer um script de shell que fará algumas perguntas ao usuário e emitirá um comando final com algumas ou outras opções, dependendo do que o usuário escolheu. No momento, o script é assim:

if [[ $a == "y" ]] ; then

    command --option 1 argument

elif [[ $a == "n" ]] ; then

    command --option 2 argument

else

    command --option 3 argument

fi

Considerando que o comando é muito longo e contém muitas opções e argumentos que permanecem constantes entre as diferentes declarações, eu queria saber se eu poderia de alguma forma escrever uma única linha, com opções variáveis sendo consideradas apenas se a condição correspondente é verdade.

Isso também se aplica a GNU parallel que emite um ou mais comandos

if [[ $b == "n" ]] ; then

    find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument

else

    find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument\; command2 --option argument
    
por Jeffrey Lebowski 08.09.2016 / 23:30

1 resposta

5

Claro, você pode armazenar as opções para passar uma variável. Seu primeiro exemplo poderia ser algo assim (também, [[ é um recurso bash, não disponível no shell POSIX):

if [[ $a == "y" ]] ; then
    arg=1
elif [[ $a == "n" ]] ; then
    arg=2
else
    arg=3
fi

command --option "$arg" argument

Seu segundo exemplo:

if [[ $b != "n" ]] ; then
    extra="; command2 --option argument"
fi

find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument$extra
# if unset, $extra will be empty—you can of course explicitly
# set it to '' if this bothers you.

Eles funcionam devido à forma como a expansão de variáveis funciona: ela é substituída pela linha de comando, depois (se não for citada) dividida em palavras e, em seguida, passada para o comando. Assim, o comando chamado não conhece as variáveis, o shell as expandiu antes de chamá-lo.

Como você está usando o bash, também é possível usar matrizes:

args=()

if [ -n "$OPT_LONG" ]; then
    args+=(-l)
fi

if [ -n "$OPT_SORT_TIME" ]; then
    args+=(-t)
fi

ls "${args[@]}"

O recurso de matriz permite que você crie facilmente listas de argumentos arbitrariamente longas sem se preocupar com a divisão de palavras quebrando seu código.

    
por 08.09.2016 / 23:54