Meu código é algo como isto:
VAR=""
while [ -z "$VAR" ]; do
VAR=$( command | grep "important_string" )
done
Então, eu quero pesquisar a saída de command
, até que important_string
apareça e coloque $VAR
.
Existe alguma diferença funcional entre [ -z "$VAR" ]
e [ "$VAR" = "" ]
?
shell-script
Minix
fonte
fonte
==
é uma sintaxe incorreta, mas funciona em muitas conchas (presumivelmente porque é a memória muscular de qualquer pessoa que use outras línguas). Você deveria estar usando=
.==
de algum lugar. Meu erro.Respostas:
Sim, eles (
[ -z "$VAR" ]
e[ "$VAR" = "" ]
...) são equivalentes. Ambos estão testando o vazio de$VAR
(por exemplo, quando não está vinculado ou definido como uma sequência vazia).Conforme comentado por Celada , coisas ruins podem acontecer ao usar
[ "$VAR" = "" ]
if seVAR
houver algum teste válido (por exemplo, ifVAR
is-z
), em particular quando[
(outest
) não for um shell embutido. Mas,bash
ouzsh
a[
um builtin e que não parece ser um problema. Você poderia usar[ "x$VAR" = "x" ]
para o seu teste. Ver teste (1)Obviamente, estou assumindo algum shell POSIX ou algo semelhante.
Talvez
-z
seja um pouco mais rápido (mas você não deve se importar com microssegundos em scripts de shell) e=
talvez seja mais legível.fonte
[ "$VAR" = "" ]
estava errado, porque se o conteúdo de$VAR
fosse começar com um hífen, isso levaria a um erro de sintaxe, por exemplo, se$VAR
contém-z
, ele seria expandido para[ -z = "" ]
- o teste=
seria vazio (o que não é)? e, em seguida, tratar""
como um argumento estranho? Mas não consigo fazê-lo falhar dessa maneira agora que o teste depois de ler sua resposta! Eu tenho usado construções como[ "x$VAR" = "xfoo" ]
para me proteger contra caracteres especiais$VAR
há décadas, talvez desnecessariamente!test
não é um builtin.[[
no bash? Eles são realmente diferentes. --- Não observo nenhum comportamento especial em relação à expansão variável com otest
build-in do bash.zsh
[ "$VAR" = "" ]
que são mais seguras de usar-z
.