Condição de carga dentro da linha de execução no Bash

1

Eu quero executar um comando com uma opção que depende da atribuição de uma variável. Se a variável estiver definida, carregue a opção com o valor, mas se não, não carregue essa opção. Isso é o que eu tenho:

if [ -n "$variable" ]
  then command ... -option $variable
  else command ...
fi

A idéia seria mesclar isso em um único comando com a condição interna, para que eu não precise repetir as outras opções do comando duas vezes.

Muito obrigado pelo seu tempo.

    
por Juan 19.09.2016 / 01:50

4 respostas

1

Usando matrizes bash:

opts=()
[ "$variable" ] && opts+=(-option "$variable")
command ... "${opts[@]}"

Como isso usa matrizes bash, isso funcionará mesmo se $variable contiver espaço em branco ou outros caracteres difíceis.

Como funciona

  • opts=()

    Isso cria uma matriz vazia chamada opts .

  • [ "$variable" ] && opts+=(-option "$variable")

    Se $variable não estiver vazio, inclua -option e $variable na matriz opts .

  • command ... "${opts[@]}"

    Isso executa seu comando. Se opts não estiver vazio, seus elementos serão adicionados ao comando. Se opts estiver vazio, nada será adicionado: seria como se "${opts[@]}" não estivesse presente.

por 19.09.2016 / 02:05
0

O seguinte one-liner serve:

[ x"$VARIABLE" = x ] && echo UNSET || echo SET

Isso testa se a variável x "$ VARIABLE" é igual a x , em outras palavras, se $ VARIABLE estiver vazia; se o teste for satisfeito, a primeira opção ( echo UNSET ) é executada, se o teste for não satisfeito, a última opção é executada ( echo SET ). Se você não deseja fazer nada no segundo caso, você pode fazer

[ x"$VARIABLE" = x ] && echo UNSET || :

Isto é consideravelmente mais simples do que as outras soluções, permite a avaliação da condição apenas uma vez, é robusto contra caracteres estranhos que aparecem em VARIÁVEL.

    
por 19.09.2016 / 15:34
0

Então pegue seu comando e faça uma função assim:

function command_function () {
  command ... -option $variable
}

if [ -n "$variable" ]
  then command_function ... -option $variable
  else command_function ...
fi

Só para você saber que os parênteses na função Bash não transmitem nada.

    
por 19.09.2016 / 02:02
0

Usando a substituição Bash ( Shell-Parameter- Expansão ) para uma sintaxe concisa e ainda legível:

$ echo ${variable:+-option $variable}

$ variable=yes
$ echo ${variable:+-option $variable}
-option yes
    
por 19.09.2016 / 11:16