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 $variable
contiver espaços em branco ou outros caracteres difíceis.
Como funciona
opts=()
Isso cria um array vazio chamado
opts
.[ "$variable" ] && opts+=(-option "$variable")
Se
$variable
não estiver vazio, acrescentamos-option
e$variable
ao arrayopts
.command ... "${opts[@]}"
Isso executa seu comando. Se
opts
não estiver vazio, seus elementos serão adicionados ao comando. Seopts
estiver 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.