Isso funciona em um prompt do shell (bash, dash):
[ -z "" ] && echo A || echo B
A
No entanto, estou tentando escrever um script de shell POSIX , ele começa assim:
#!/bin/sh
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1
readonly raw_input_string=${1}
[ -z "${raw_input_string}" ] && echo "The given argument is empty."; exit 1
E não sei porque, mas não recebo a mensagem :
O argumento fornecido está vazio.
se eu chamar o script assim:
./test_empty_argument ""
Por que é que?
Observe que sua linha
isso é o mesmo que
(um sem aspas
;
pode, na maioria das circunstâncias, ser substituído por um caractere de nova linha)Isso significa que a
exit 1
instrução é sempre executada independentemente de quantos argumentos foram passados para o script. Isso, por sua vez, significa que a mensagemThe given argument is empty.
nunca teria chance de ser impressa.Para executar mais de uma instrução após um teste usando a "sintaxe de curto-circuito", agrupe as instruções em
{ ...; }
. A alternativa é usar umaif
declaração adequada (que, IMHO, parece mais limpa em um script):Você tem o mesmo problema com seu segundo teste.
Em relação a
Isso funcionaria para o exemplo dado, mas o genérico
não seria o mesmo que
Em vez disso, é mais como
ou
Ou seja, se o teste ou o primeiro comando falhar, o segundo comando será executado, o que significa que ele tem o potencial de executar todas as três instruções envolvidas.
Este:
não é:
Mas em vez disso é:
Seu script está saindo independentemente de quantos argumentos você passou para ele.
Uma maneira de torná-lo mais legível é definir uma
die
função (à laperl
) como:Você pode adicionar mais sinos e assobios como cores, prefixo, número de linha... se necessário.
Muitas vezes vi isso como um teste para uma string vazia: