Saya menjalankan beberapa skrip yang melewati argumen string dan saya ingin lakukan jika pernyataan lain ditampilkan di bawah ini:
if [ $1 != '' ] && [ $2 != '' ]
then
do something.....
tapi itu terlihat Error too many argument
. Mengapa?
command-line
bash
scripts
taymindis Woon
sumber
sumber
[[ ]]
. Kalau tidak, Anda harus mengutip variabel Anda.$1
bisa tidak disetel atau disetel ke string nol oleh pengguna skrip. Pertimbangkan urutan perintah ini:$ set '' bar
laluecho "x${1}x";
Kedua variabel ditetapkan, tetapi salah satunya adalah nol.Jawaban:
Coba gunakan tes -z:
Dari manusia
bash
:sumber
Karena ini ditandai
bash
, saya sarankan Anda menggunakan konstruksi tes diperpanjang ([[...]]
) , dan lupakan tanda kutip:Kecuali jika Anda
sh
menginginkan kompatibilitas / POSIX, tidak ada alasan untuk tidak menggunakannya[[ ]]
.sumber
Berikut ini juga berfungsi,
sumber
&&
dan pemisah perintah logis lainnya tidak diperbolehkan dalam klasiktest
. Anda harus menggunakan konstruksi tes lain sebagai gantinya (seperti-a
, saya pikir)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 diujibash
tampaknya tidak menjadi masalah:Dengan
/bin/sh
yang sebenarnya terhubung ke/bin/dash
Ubuntu, kesalahan dilaporkan sebagai berikut:Dan
/bin/test
juga standalone :Sidenote: Jika Anda bertanya-tanya apa
/usr/bin/test
dan mengapa saya menggunakanbash
dansh
, maka Anda harus tahu itu[
adalah alias untuktest
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 . Adapunif
pernyataan, mereka beroperasi pada patung keluar dari perintah, karenanya mengapa[
dantest
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:Cara yang lebih baik untuk menguji variabel yang tidak disetel
Pendekatan yang sangat sering Anda lihat adalah:
Mengutip Gilles :
Agaknya, ini harus cukup portabel karena saya sudah melihatnya di
/bin/sh
skrip. Ini juga dapat digabungkan seperti padaTentu saja kita dapat menggunakan
-z
bendera, namun menurut penelitian di beberapa kerang, terutama ksh88 (menurut Stephane Chazelas ), bendera ini salah.Lihat juga
\[
vs\[\[
vs((
sumber
Saya pikir judul posting tidak akurat, karena maksud dalam pesan itu adalah untuk memeriksa apakah $ 1 dan $ 2 bukan nol. Contoh yang diberikan hanya menghilangkan tanda kutip ganda dalam $ 1 dan $ 2 untuk bekerja. Variabel harus dikutip ganda agar diperluas ketika membandingkan string. Tetapi, untuk memeriksa apakah $ 1 dan $ 2 ada sama dengan memeriksa apakah $ 2 ada, karena tidak bisa ada jika $ 1 tidak ada. Perintah 'jika' juga tidak diperlukan dalam kasus ini, karena 'tes' mengembalikan benar / salah dan menggunakan '&&' sebagai 'maka' jika pengembalian adalah 0 / benar:
Lebih sederhana, dengan -n (bukan nol):
Untuk "memeriksa apakah $ 1 dan $ 2 adalah nol" akan sama dengan memeriksa jika tidak ada parameter:
sumber