Beberapa shell historis menerapkan parser yang sangat sederhana yang dapat dikacaukan oleh hal-hal seperti di [ -n = "" ]
mana operan pertama =
terlihat seperti operator, dan akan menguraikannya sebagai [ -n = ]
atau menyebabkan kesalahan sintaksis. Dalam [ "x$1" = x"" ]
, x
awalan memastikan bahwa x"$1"
tidak mungkin terlihat seperti operator, dan satu-satunya cara shell dapat menguraikan tes ini adalah dengan memperlakukan =
sebagai operator biner.
Semua shell modern, dan bahkan sebagian besar shell yang lebih lama masih beroperasi, ikuti aturan POSIX yang mengamanatkan bahwa semua ekspresi uji hingga 4 kata diurai dengan benar. Jadi [ -z "$1" ]
adalah cara yang tepat untuk menguji jika $1
kosong , dan [ "$x" = "$y" ]
merupakan cara yang tepat untuk menguji kesetaraan dua variabel.
Bahkan beberapa shell saat ini dapat dikacaukan dengan ekspresi yang lebih lama, dan beberapa ekspresi sebenarnya ambigu, jadi hindari penggunaan -a
dan -o
operator untuk membangun tes boolean yang lebih lama, dan alih-alih gunakan panggilan terpisah ke [
dan shell milik sendiri &&
dan ||
operator boolean.
Gilles 'SANGAT berhenti menjadi jahat'
sumber
sh
pada beberapa Unix komersial masih memiliki masalah. Lihat di sini untuk detailnya.[ -z "$1" ]
adalah cara pengujian yang benar jika$1
kosong .sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'
- keduanya mengembalikan 0, tetapi dalam kasus kedua$1
tidak boleh kosong karena tidak ada.Menurut http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html ,
-z
tes ini tidak aman di beberapa implementasi , mungkin ketika string "menarik" seperti"-o a=a"
diuji.sumber
Tes di atas juga akan menyebabkan kesalahan jika Anda menjalankan dengan "set -u" atau "set -o nounset"
Cara yang lebih stabil untuk memeriksa variabel kosong adalah dengan menggunakan ekspansi parameter :
MYVAR = $ {MYVAR: - "Nilai Buruk"}
Metode ini berfungsi untuk shell bourne tradisional, juga ksh, dan bash.
sumber
sumber
=
versus-z
, sekarang bagaimana.