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 bash
tampaknya tidak menjadi masalah:
$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected
Dengan /bin/sh
yang sebenarnya terhubung ke /bin/dash
Ubuntu, kesalahan dilaporkan sebagai berikut:
$ sh
$ [ $1 != '' ] && [ $2 != '' ]
sh: 1: [: !=: unexpected operator
Dan /bin/test
juga standalone :
$ /usr/bin/test $1 != ''
/usr/bin/test: missing argument after ‘’
Sidenote: Jika Anda bertanya-tanya apa /usr/bin/test
dan mengapa saya menggunakan bash
dan sh
, maka Anda harus tahu itu [
adalah alias untuk test
perintah, 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 if
pernyataan, mereka beroperasi pada patung keluar dari perintah, karenanya mengapa [
dan test
perintah, 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 test
mengerti. 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/sh
skrip. Ini juga dapat digabungkan seperti pada
if [ "x${var1}${var2}" == "x" ]; then
...
fi
Tentu saja kita dapat menggunakan -z
bendera, namun menurut penelitian di beberapa kerang, terutama ksh88 (menurut Stephane Chazelas ), bendera ini salah.
Lihat juga