Sinalizadores Bash com base em instruções if [duplicado]

Esta pergunta já tem respostas aqui :

Comentários

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:


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 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *