Kode berikut memberi
[: -ge: diharapkan operator unary
kapan
i=0
if [ $i -ge 2 ]
then
#some code
fi
Mengapa?
Masalah Anda muncul dari fakta yang $i
memiliki nilai kosong saat pernyataan Anda gagal. Selalu kutip variabel Anda saat melakukan perbandingan jika ada kemungkinan kecil salah satunya kosong, misalnya:
if [ "$i" -ge 2 ] ; then
...
fi
Ini karena cara shell memperlakukan variabel. Asumsikan contoh aslinya,
if [ $i -ge 2 ] ; then ...
Hal pertama yang dilakukan shell saat menjalankan baris kode tertentu adalah mengganti nilainya $i
, seperti fungsi pencarian & ganti editor favorit Anda . Jadi asumsikan itu $i
kosong atau, bahkan lebih ilustratif, asumsikan itu $i
adalah sekumpulan ruang! Shell akan diganti $i
sebagai berikut:
if [ -ge 2 ] ; then ...
Sekarang substitusi variabel dilakukan, hasil shell dengan perbandingan dan .... gagal karena tidak dapat melihat apa-apa dimengerti ke kiri dari -gt
. Namun, mengutip $i
:
if [ "$i" -ge 2 ] ; then ...
menjadi:
if [ " " -ge 2 ] ; then ...
Shell sekarang melihat tanda kutip ganda, dan tahu bahwa Anda sebenarnya membandingkan empat kosong dengan 2 dan akan melewati if
.
Anda juga memiliki opsi untuk menentukan nilai default $i
jika $i
kosong, sebagai berikut:
if [ "${i:-0}" -ge 2 ] ; then ...
Ini akan menggantikan nilai 0 bukan $i
adalah $i
tidak terdefinisi. Saya masih mempertahankan tanda kutip karena, sekali lagi, jika $i
ada sekumpulan kosong maka tidak dihitung sebagai tidak ditentukan , itu tidak akan diganti dengan 0, dan Anda akan mengalami masalah sekali lagi.
Silakan baca ini jika Anda punya waktu. Shell diperlakukan seperti kotak hitam oleh banyak orang, tetapi beroperasi dengan sangat sedikit dan aturan yang sangat sederhana - setelah Anda mengetahui apa aturan itu (salah satunya adalah cara kerja variabel di shell, seperti dijelaskan di atas) shell akan tidak punya rahasia lagi untukmu.
Dilihat dari pesan kesalahan nilai i adalah string kosong saat Anda mengeksekusinya, bukan 0.
sumber
Saya perlu menambahkan 5 sen saya. Saya melihat semua orang menggunakan
[
atau[[
, tetapi perlu disebutkan bahwa mereka bukan bagian dari sintaks if.Untuk perbandingan aritmatika, gunakan
((...))
saja.sumber
Bagian naskah Anda bekerja dengan sangat baik. Apakah Anda yakin tidak sedang menetapkan apa pun sebelum "i"?
Kesalahan umum juga adalah tidak meninggalkan spasi setelah dan sebelum tanda kurung siku.
sumber