Saya tidak dapat menemukan satu sumber daya sederhana yang menjelaskan arti dan memperbaiki kesalahan BASH shell berikut, jadi saya memposting apa yang saya temukan setelah meneliti itu.
Kesalahan:
-bash: [: too many arguments
Versi Google ramah-: bash open square bracket colon too many arguments
.
Konteks: kondisi if dalam kurung kotak tunggal dengan operator perbandingan sederhana seperti sama, lebih besar dari dll, misalnya:
VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
# some action
fi
bash
if-statement
arguments
user56reinstatemonica8
sumber
sumber
Jawaban:
Jika
$VARIABLE
string Anda berisi spasi atau karakter khusus lainnya, dan tanda kurung siku digunakan (yang merupakan pintasan untuktest
perintah), maka string tersebut dapat dibagi menjadi beberapa kata. Masing-masing diperlakukan sebagai argumen terpisah.Sehingga satu variabel dibagi menjadi banyak argumen :
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,
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 dari
cron
, tergantung pada bagaimana semuanya dikonfigurasi.Akan terlihat seperti ini:
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[[
aliasnew test
.Waspadalah terhadap
[: unary operator expected
kesalahan tersebutJika 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:(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 untuktest
, semua hal di atas juga berlaku untuk kesalahantest: too many arguments
(dan jugatest: unary operator expected
)sumber
i=$(some_command); i=$((i)); if [ "$i" == 0 ] ...
Hanya menabrak posting ini, dengan mendapatkan kesalahan yang sama, mencoba menguji apakah dua variabel keduanya kosong (atau tidak kosong). Itu ternyata menjadi perbandingan majemuk - 7.3. Operator Perbandingan Lainnya - Panduan Script Bash Lanjutan ; dan saya pikir saya harus perhatikan hal berikut:
berpikir itu berarti "kosong" pada awalnya; tetapi itu berarti "file ada" - digunakan-e
-z
untuk menguji variabel kosong (string)test
s dan&&
mereka:[ ... ] && [ ... ]
-a
operator dalam satutest
:[ ... -a ... ]
Berikut ini adalah perintah yang berfungsi (mencari melalui semua file txt di direktori, dan membuang yang
grep
menemukan mengandung dua kata):Sunting 12 Agustus 2013: catatan masalah terkait:
Perhatikan bahwa ketika memeriksa kesetaraan string dengan klasik
test
(braket persegi tunggal[
), Anda HARUS memiliki ruang antara operator "sama", yang dalam hal ini adalah tanda "sama dengan"=
(meskipun tanda dua sama==
nampaknya diterima sebagai kesetaraan operator juga). Dengan demikian, ini gagal (diam-diam):... tapi tambahkan spasi - dan semua terlihat bagus:
sumber
((A || B) && C)
?Skenario lain yang bisa Anda dapatkan
[: too many arguments
atau[: a: binary operator expected
galat adalah jika Anda mencoba menguji semua argumen"$@"
Ini berfungsi dengan benar jika Anda menelepon
foo.sh
ataufoo.sh arg1
. Tetapi jika Anda melewati beberapa argumen sepertifoo.sh arg1 arg2
, Anda akan mendapatkan kesalahan. Ini karena sedang diperluas ke[ -z arg1 arg2 ]
, yang bukan sintaks yang valid.Cara yang benar untuk memeriksa adanya argumen adalah
[ "$#" -eq 0 ]
. ($#
adalah jumlah argumen).sumber
Beberapa kali Jika Anda menyentuh keyboard secara tidak sengaja dan menghapus spasi.
Akan memicu pesan kesalahan ini. Perhatikan spasi sebelum ']' diperlukan.
sumber
Saya memiliki masalah yang sama dengan skrip saya. Tetapi ketika saya melakukan beberapa modifikasi itu berhasil untuk saya. Saya memang suka ini: -
dengan begitu saya menyelesaikan masalah saya. Semoga itu akan membantu Anda juga.
sumber