Condição de carga na linha de execução no Bash

Condição de carga na linha de execução no Bash

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 estiver, não carregue essa opção. Isto é o que eu tenho:

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

A ideia 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.

Responder1

Usando matrizes bash:

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

Como usa matrizes bash, funcionará mesmo se $variablecontiver espaços em branco ou outros caracteres difíceis.

Como funciona

  • opts=()

    Isso cria um array vazio chamado opts.

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

    Se $variablenão estiver vazio, acrescentamos -optione $variableao array opts.

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

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

Responder2

Então pegue seu comando e faça dele 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 passam nada.

Responder3

UsandoBashsubstituição (Expansão de parâmetro de shell) para uma sintaxe concisa e ainda legível:

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

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

Responder4

A seguinte linha servirá:

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

Isso testa se a variávelx"$VARIÁVEL"é igual ax, em outras palavras, se$VARIÁVELestá vazia; se o teste for satisfeito, a primeira opção (eco DESCONFIGURADO) é executado, se o teste fornãosatisfeito, a última opção é executada (eco SET). Se você não quiser fazer nada no segundo caso, você pode fazer

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

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

informação relacionada