Apakah ["$ VAR" = ""] dan [-z "$ VAR"] selalu setara?

8

Kode saya terlihat seperti ini:

VAR=""

while [ -z "$VAR" ]; do
  VAR=$( command | grep "important_string" )
done

Jadi saya ingin polling output command, sampai important_stringmuncul dan dimasukkan $VAR.

Apakah ada perbedaan fungsional antara [ -z "$VAR" ]dan [ "$VAR" = "" ]?

Minix
sumber
3
==adalah sintaks yang salah, tetapi bekerja di banyak shell (mungkin karena itu adalah memori otot untuk siapa saja yang menggunakan bahasa lain). Anda harus menggunakan =.
l0b0
@ l0b0 menyalin ==dari suatu tempat. Kesalahanku.
Minix

Jawaban:

5

Ya mereka ( [ -z "$VAR" ]dan [ "$VAR" = "" ]...) setara. Keduanya menguji kekosongan $VAR(misalnya ketika tidak terikat, atau diatur ke string kosong).

Sebagai berkomentar oleh Celada , hal-hal buruk yang mungkin terjadi saat menggunakan [ "$VAR" = "" ] jika VARbeberapa tes yang valid (misalnya jika VARini -z), khususnya ketika [(atau test) adalah tidak builtin shell. Tapi di bashatau zshyang [adalah builtin dan yang tampaknya tidak menjadi masalah. Anda bisa menggunakan [ "x$VAR" = "x" ]untuk tes Anda. Lihat tes (1)

Tentu saja, saya mengasumsikan beberapa shell POSIX atau yang serupa.

Mungkin -zmungkin sedikit lebih cepat (tetapi Anda seharusnya tidak peduli tentang mikrodetik dalam skrip shell) dan Anda mungkin menemukan =mungkin lebih mudah dibaca.

Basile Starynkevitch
sumber
5
Saya yakin [ "$VAR" = "" ]itu salah karena jika isinya $VARdimulai dengan tanda hubung maka akan menyebabkan kesalahan sintaksis, misalnya jika $VARberisi -zmaka akan diperluas ke [ -z = "" ]- apakah tes itu jika =kosong (yang tidak) dan kemudian memperlakukan ""sebagai argumen asing? Tapi sepertinya saya tidak bisa gagal sekarang karena saya mencobanya setelah membaca jawaban Anda! Saya telah menggunakan konstruksi seperti [ "x$VAR" = "xfoo" ]untuk menjaga terhadap karakter khusus $VARselama beberapa dekade, mungkin tidak perlu!
Celada
@ Celada: Saya pikir poin Anda adalah benar untuk shell langka di mana testbukan builtin.
Basile Starynkevitch
1
Saya pikir tentang ekspansi shell built-in harus berperilaku dengan cara yang sama seperti perintah eksternal. Bukankah Anda bingung dengan kata kunci seperti [[di bash? Mereka sangat berbeda. --- Saya tidak mengamati perilaku khusus apa pun terkait ekspansi variabel dengan testbuild-in of bash.
pabouk
Saya diuji denganzsh
Basile Starynkevitch
@Celada sebenarnya, Anda benar, ada begitu banyak hal yang bisa salah menggunakan [ "$VAR" = "" ]yang lebih aman untuk digunakan -z.
Braiam