Em um script bash, estou disposto a verificar se um parâmetro tem um valor booleano ("verdadeiro" ou "falso").
Estou tentando isso em dois scripts de duas maneiras diferentes, ambas falhando.
Eu verifiquei muitas dicas do Stack Exchange e acredito que estou fazendo o que devo, mas não é o caso.
if [ "$2" != "true" ] -a [ "$2" != "false" ]; then
echo "Indiquez si Geoserver est en installation initiale (false) ou update (true)" >&2;
exit 1;
fi
falha com a mensagemGeoserver.sh: 12: [: true: unexpected operator
if [[ "$3" != "true" && "$3" != "false" ]]; then
echo "Indiquez si Kafka est en installation initiale (false) ou update (true)" >&2;
exit 1;
fi
falha comKafka.sh: 18: [[: not found
A forma padrão seria
Isso é executar dois
[
comandos, cada um executando um único teste e encadeados com o&&
operador do shell.[[...]]
é uma sintaxe especial de shell não padrão do ksh, suportada por muitos shells ricos em recursos e (geralmente) suporta&&
dentro dos colchetes. Ele deve estar disponívelbash
desde quebash
não tenha sido construído com--disable-cond-command
, mas o texto da sua mensagem de erro sugere que você está usando odash
shell. Combash
construído com--disable-cond-command
, os erros seriam:Geoserver.sh: 12: [: too many arguments
eKafka.sh: 18: [[: command not found
respectivamente.-a
teria suporte dentro[
para compatibilidade com versões anteriores, como em[ "$2" != "true" -a "$2" != "false" ]
, mas é obsoleto e quebrado por design e (como sua-o
contraparte para ou ) não deve ser usado.É complicado, veja por exemplo
Por que `[` é um shell interno e `[[` uma palavra-chave do shell? e
Qual é a diferença entre os operadores Bash [[ vs [ vs ( vs ((? e
Por que a expansão de parâmetros com espaços sem aspas funciona dentro de colchetes duplos "[[" mas não dentro de colchetes simples "["?
Ambos os erros sugerem que você não está usando
bash
nada, mas algum shell com menos recursos, comodash
por exemplo.Além disso, em seu primeiro exemplo, você implementou incorretamente uma cláusula "e".
Isso é o que eu acho que você estava procurando e deve funcionar se você realmente usar
bash
:Embora o método preferido tenda a ser esta opção mais portátil:
O erro para o segundo exemplo novamente sugere que você não está usando um shell que suporte
[[ ]]
a notação, se você mudar para a notação de estilo acima,[ ] && [ ]
poderá ter mais sucesso.