Kode saya terlihat seperti ini:
VAR=""
while [ -z "$VAR" ]; do
VAR=$( command | grep "important_string" )
done
Jadi saya ingin polling output command
, sampai important_string
muncul dan dimasukkan $VAR
.
Apakah ada perbedaan fungsional antara [ -z "$VAR" ]
dan [ "$VAR" = "" ]
?
shell-script
Minix
sumber
sumber
==
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=
.==
dari suatu tempat. Kesalahanku.Jawaban:
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" = "" ]
jikaVAR
beberapa tes yang valid (misalnya jikaVAR
ini-z
), khususnya ketika[
(atautest
) adalah tidak builtin shell. Tapi dibash
atauzsh
yang[
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
-z
mungkin sedikit lebih cepat (tetapi Anda seharusnya tidak peduli tentang mikrodetik dalam skrip shell) dan Anda mungkin menemukan=
mungkin lebih mudah dibaca.sumber
[ "$VAR" = "" ]
itu salah karena jika isinya$VAR
dimulai dengan tanda hubung maka akan menyebabkan kesalahan sintaksis, misalnya jika$VAR
berisi-z
maka 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$VAR
selama beberapa dekade, mungkin tidak perlu!test
bukan builtin.[[
di bash? Mereka sangat berbeda. --- Saya tidak mengamati perilaku khusus apa pun terkait ekspansi variabel dengantest
build-in of bash.zsh
[ "$VAR" = "" ]
yang lebih aman untuk digunakan-z
.