Saya memiliki if
blok berikut dalam skrip bash saya:
if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi
Eksekusi skrip tidak memasuki if
blok saya meskipun $PACKAGENAME
sama dengan kakadu-v6_4-00902C
. Apa yang saya lakukan salah?
bash
shell-script
test
DemiSheep
sumber
sumber
-eq
berlaku untuk bilangan bulat, Anda ingin menguji string atau regex (==
atau=~
): mywiki.wooledge.org/BashGuide/TestsAndConditionalsjasonwryan
saya akan melihat sumber ini!Jawaban:
-eq
adalah operator aritmatika, yang membandingkan dua angka.Gunakan
=
(portable / standarsh
),=~
atau==
sebagai gantinya.Juga gunakan tanda kutip, karena jika
${PACKAGENAME}
berisi karakter spasi atau karakter pengganti, maka itu akan dibagi menjadi beberapa argumen, yang menyebabkan[
lebih banyak argumen terlihat dari yang diinginkan. Lihat di sini daftar perangkap bash umum.Lihat
man bash
, cari ( /) untukCONDITIONAL EXPRESSIONS
.sumber
polym
saya akan memeriksanya, terima kasih untuk sumber dayanya! Saya akan membuka tab itu di sebelah panduan VI saya. :)[[ $PACKAGENAME == "kakadu..." ]]
juga OK.=
,==
dan!=
, karena sisi itu adalah pola, bukan string. Sebagai contoh,foo='*'; [[ whatever = $foo ]]
itu benar.Ganti
-eq
dengan==
demikian jika blok Anda adalah ini: -sumber
Cara lain adalah dengan meniadakannya:
Blok di atas tes pertama jika
"$PACKAGENAME"
memiliki nilai sama sekali, dan, jika tidak keluar dengan kesalahan dan gema?'this'}
untukstderr
. Jika shell induknya masih ada maka tes telah lulus, dan tes berikutnya akan menghapus string 'kakadu ...' Anda dari variabel yang menghasilkan-z
string kosong. Jika tidak, maka ia memancarkan kesalahan dan keluar dari shell. Jika shell Anda masih ada pada titik ini apa pun setelah blok dieksekusi, kalau tidak, shell tidak.Mungkin hal semacam ini paling baik diimplementasikan dalam suatu fungsi. Seperti:
Dengan fungsi itu Anda dapat memberikan argumen sebanyak yang diizinkan oleh sistem Anda. Jika Anda memberikan kurang dari 2, itu akan mengembalikan 1 dan mengirim pesan ke
stderr
. Jika Anda memberikan 2 atau lebih argumen, itu akan memperlakukan semua sebagai string dan mengembalikan 0 jika semua sama dan bukan nol, itu akan mengembalikan nomor argumen yang pertama gagal cek.Dalam kasus Anda dapat digunakan seperti:
Untuk menunjukkan lebih lanjut, saya akan menulis fungsi lain:
DEMO:
KELUARAN:
sumber