Esta pergunta já tem respostas aqui :
Comentários
- Coberto em Mas e se …?
Resposta
Você pode construir o comando em uma matriz:
#!/bin/bash var=ON cmd=( /home/username/myscript ) # create array with one element if [ "$var" == "ON" ]; then cmd+=( -a ) # append to the array fi cmd+=( -b 76 ) # append two elements
E, em seguida, execute-a com:
"${cmd[@]}"
Observe as aspas em torno da última parte e os parênteses em torno das atribuições acima. A sintaxe é feia, mas funciona em face de argumentos que contêm espaço em branco e tal. (Use aspas para adicionar argumentos com espaços, por exemplo, cmd+=("foo bar")
)
Relacionado, com métodos menos feios e maneiras de falhar:
- Como podemos executar um comando armazenado em uma variável?
- Usando o shell variáveis para opções de comando
Em casos simples, como aquele argumento opcional aqui, você poderia se safar com a expansão de valor alternativo:
var=x myscript ${var:+"-a"} -b 76
Aqui, ${var:+foo}
insere foo
if var
não está vazio (para que var=ON
, var=FALSE
, var=x
o inseririam) e nada se estiver vazio ou não definido (var=
ou unset var
). Tenha cuidado com os problemas habituais de citação.
Comentários
- +1 Esta sintaxe é feia e é mais complexa, mas a solução é escalável, embora minha solução é mais simples, mas evoluiria rapidamente para uma bagunça se mais combinações de sinalizadores fossem consideradas.
- Obrigado! Exatamente o que ' estou procurando!
- @theta, adicionei outra opção, menos feia e mais propensa a ficar bagunçada se expandida.
Resposta
Se bem entendi:
var=ON if [ "$var" = "ON" ]; then /home/username/myscript -a -b 76 else /home/username/myscript -b 76 fi