[“$ VAR” = “”] e [-z “$ VAR”] são sempre equivalentes?

8

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_stringapareça e coloque $VAR.

Existe alguma diferença funcional entre [ -z "$VAR" ]e [ "$VAR" = "" ]?

Minix
fonte
3
==é 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 =.
L0b0 06/07/2015
@ l0b0 copiou o ==de algum lugar. Meu erro.
Minix

Respostas:

5

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 se VARhouver algum teste válido (por exemplo, if VARis -z), em particular quando [(ou test) não for um shell embutido. Mas, bashou zsha [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 -zseja um pouco mais rápido (mas você não deve se importar com microssegundos em scripts de shell) e =talvez seja mais legível.

Basile Starynkevitch
fonte
5
Eu com certeza [ "$VAR" = "" ]estava errado, porque se o conteúdo de $VARfosse começar com um hífen, isso levaria a um erro de sintaxe, por exemplo, se $VARconté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 $VARhá décadas, talvez desnecessariamente!
Celada
@ Celada: Eu acho que o seu ponto é verdadeiro para as conchas raras, onde testnão é um builtin.
Basile Starynkevitch
1
Eu acho que as expansões internas dos shell das expansões devem se comportar da mesma maneira que os comandos externos. Você não confundiu com palavras-chave como [[no bash? Eles são realmente diferentes. --- Não observo nenhum comportamento especial em relação à expansão variável com o testbuild-in do bash.
Pabouk
Eu testei comzsh
Basile Starynkevitch
@ Celada, na verdade, você está certo, existem tantas coisas que podem dar errado usando [ "$VAR" = "" ]que são mais seguras de usar -z.
Braiam 06/07/2015