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 , que 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 por que, mas não recebo a mensagem :
O argumento fornecido está vazio.
se eu chamar o script assim:
./test_empty_argument ""
Por que é que?
shell-script
arguments
LinuxSecurityFreak
fonte
fonte
if [ X”” = X”$var” ] ; then echo isempty ; fi
[ "" = "$var" ]
funcionaria bem; uma string vazia entre aspas não será removida da lista de argumentos de[
. Mas isso também não é necessário, porque[ -z "$var" ]
também funciona muito bem.Respostas:
Observe que sua linha
isso é o mesmo que
(um não citado
;
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. Por sua vez, isso significa que a mensagemThe given argument is empty.
nunca teria a chance de ser impressa.Para executar mais de uma única 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.
A respeito de
Isso funcionaria para o exemplo dado, mas o genérico
seria não ser 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.
fonte
Este:
não é:
Mas em vez disso é:
Seu script está saindo, independentemente de quantos argumentos você passou para ele.
fonte
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 da linha ... se necessário.
fonte
die
função com vários argumentos? (Se sim, você pode dar um exemplo?) Eu uso umadie
função quase idêntica , mas em"$*"
vez disso, qual pode ser mais o que você pretende?"$@"
é que ele permite mensagens de várias linhas sem a necessidade de adicionar novas linhas literais."$*"
para associar argumentos a espaços também significa que você precisa definir o$IFS
SPC para que ele funcione em todos os contextos, incluindo aqueles onde$IFS
foram modificados. Como alternativa comksh
/zsh
, você pode usarprint -r -- "$@"
ouecho -E - "$@"
emzsh
.die
função -type. O que estou perguntando é: na prática, você já viu alguém escreverdie "unable to blah:" "some error"
, com o objetivo de receber uma mensagem de erro de duas linhas?die() { IFS=" "; printf >&2 "%s\n" "$*"; exit 1; }
. Você já usou pessoalmente esse tipo dedie
função paraprintf
gerar uma mensagem de erro de várias linhas passando vários argumentos? Ou você apenas passa um único argumento paradie
que ele adicione apenas uma nova linha à saída?Eu sempre vi isso como um teste para uma string vazia:
fonte
-a
,-o
,(
e)
como derectives para contartest
para combinar várias operações em uma única invocação são evitados; consulte os marcadores OB em pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html )./bin/sh
e o antecessor imediato do Heirloom Bourne) também não o tinha.