Untuk versi jawaban yang lama, lihat bagian kedua dari jawaban ini. Jika Anda ingin tahu detailnya, baca terus
Penyebab masalah
Dalam pertanyaan itu sendiri, dilaporkan bahwa OP melihat too many arguments error, yang ketika diuji bashtampaknya tidak menjadi masalah:
$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected
Dengan /bin/shyang sebenarnya terhubung ke /bin/dashUbuntu, kesalahan dilaporkan sebagai berikut:
$ sh
$ [ $1 != '' ] && [ $2 != '' ]
sh: 1: [: !=: unexpected operator
Dan /bin/testjuga standalone :
$ /usr/bin/test $1 != ''
/usr/bin/test: missing argument after ‘’
Sidenote: Jika Anda bertanya-tanya apa /usr/bin/testdan mengapa saya menggunakan bashdan sh, maka Anda harus tahu itu [adalah alias untuk testperintah, yang juga ada sebagai mandiri yang dapat dieksekusi atau lebih umum - sebagai built-in shell yang merupakan masing-masing shell yang akan digunakan terlebih dahulu . Adapun ifpernyataan, mereka beroperasi pada patung keluar dari perintah, karenanya mengapa [dan testperintah, dengan segala sesuatu yang lain argumen untuk perintah itu - urutan yang tidak tepat dari argumen baris perintah menyebabkan kesalahan.
Kembali ke topik: tidak jelas bagaimana OP mendapat kesalahan yang tidak terkait. Namun, dalam ketiga kasus ini masalahnya sama - variabel yang tidak disetel akan diperlakukan sebagai kosong, jadi apa yang shell lihat dengan variabel-variabel yang tidak dikutip ini adalah
[ != '' ]
yang memecah sintaks yang testmengerti. Ingat apa yang saya katakan tentang urutan argumen baris perintah yang tidak tepat? Karena itu mengapa mengutip itu penting. Mari kita aktifkan hasil diagnostik dan lihat apa yang dijalankan shell:
$ set -x
# throws error
$ [ $1 != '' ] && [ $2 != '' ]
+ '[' '!=' '' ']'
bash: [: !=: unary operator expected
# no error
$ [ "$1" != '' ] && [ "$2" != '' ] || echo null vars
+ '[' '' '!=' '' ']'
+ echo null vars
null vars
Cara yang lebih baik untuk menguji variabel yang tidak disetel
Pendekatan yang sangat sering Anda lihat adalah:
if [ "x$var1" == "x" ] && [ "x$var2" == "x" ];
then
echo "both variables are null"
fi
Mengutip Gilles :
Dalam ["x $ 1" = "x"], awalan x memastikan bahwa x "$ 1" tidak mungkin terlihat seperti operator, sehingga satu-satunya cara shell dapat menguraikan tes ini adalah dengan memperlakukan = sebagai operator biner.
Agaknya, ini harus cukup portabel karena saya sudah melihatnya di /bin/shskrip. Ini juga dapat digabungkan seperti pada
if [ "x${var1}${var2}" == "x" ]; then
...
fi
Tentu saja kita dapat menggunakan -zbendera, namun menurut penelitian di beberapa kerang, terutama ksh88 (menurut Stephane Chazelas ), bendera ini salah.
Lihat juga