Jika $VARIABLE
string Anda berisi spasi atau karakter khusus lainnya, dan tanda kurung siku digunakan (yang merupakan pintasan untuk test
perintah), maka string tersebut dapat dibagi menjadi beberapa kata. Masing-masing diperlakukan sebagai argumen terpisah.
Sehingga satu variabel dibagi menjadi banyak argumen :
VARIABLE=$(/some/command);
# returns "hello world"
if [ $VARIABLE == 0 ]; then
# fails as if you wrote:
# if [ hello world == 0 ]
fi
Hal yang sama akan berlaku untuk panggilan fungsi apa pun yang meletakkan string yang berisi spasi atau karakter khusus lainnya.
Memperbaiki mudah
Bungkus output variabel dalam tanda kutip ganda, memaksanya untuk tetap sebagai satu string (karena itu satu argumen). Sebagai contoh,
VARIABLE=$(/some/command);
if [ "$VARIABLE" == 0 ]; then
# some action
fi
Sederhana seperti itu. Tetapi lompat ke "Waspadalah juga ..." di bawah ini jika Anda juga tidak dapat menjamin variabel Anda tidak akan menjadi string kosong, atau string yang hanya berisi spasi kosong.
Atau, perbaikan alternatif adalah dengan menggunakan tanda kurung kotak ganda (yang merupakan jalan pintas untuk new test
perintah).
Ini hanya ada di bash (dan tampaknya korn dan zsh), dan karenanya mungkin tidak kompatibel dengan shell default yang dipanggil oleh /bin/sh
dll.
Ini berarti pada beberapa sistem, mungkin bekerja dari konsol tetapi tidak ketika dipanggil di tempat lain, seperti daricron
, tergantung pada bagaimana semuanya dikonfigurasi.
Akan terlihat seperti ini:
VARIABLE=$(/some/command);
if [[ $VARIABLE == 0 ]]; then
# some action
fi
Jika perintah Anda berisi tanda kurung ganda seperti ini dan Anda mendapatkan kesalahan dalam log tetapi berfungsi dari konsol, coba menukar [[
alternatif yang disarankan di sini, atau, pastikan bahwa apa pun yang menjalankan skrip Anda menggunakan shell yang mendukung [[
alias new test
.
Waspadalah terhadap [: unary operator expected
kesalahan tersebut
Jika Anda melihat kesalahan "terlalu banyak argumen", kemungkinan Anda mendapatkan string dari fungsi dengan output yang tidak dapat diprediksi. Jika juga dimungkinkan untuk mendapatkan string kosong (atau semua string spasi putih), ini akan diperlakukan sebagai argumen nol bahkan dengan "perbaikan cepat" di atas, dan akan gagal dengan[: unary operator expected
Ini sama dengan 'gotcha' jika Anda terbiasa dengan bahasa lain - Anda tidak berharap isi dari variabel dicetak secara efektif ke dalam kode seperti ini sebelum dievaluasi.
Berikut adalah contoh yang mencegah kesalahan [: too many arguments
dan [: unary operator expected
kesalahan: mengganti output dengan nilai default jika kosong (dalam contoh ini, 0
), dengan tanda kutip ganda melilit semuanya:
VARIABLE=$(/some/command);
if [ "${VARIABLE:-0}" == 0 ]; then
# some action
fi
(di sini, tindakan akan terjadi jika $ VARIABEL adalah 0, atau kosong. Secara alami, Anda harus mengubah 0 (nilai default) ke nilai default yang berbeda jika perilaku yang berbeda diinginkan)
Catatan akhir: Karena [
merupakan jalan pintas untuk test
, semua hal di atas juga berlaku untuk kesalahan test: too many arguments
(dan juga test: unary operator expected
)