Bandingkan integer dalam bash, diharapkan operator unary

137

Kode berikut memberi

[: -ge: diharapkan operator unary

kapan

i=0

if [ $i -ge 2 ]
then
    #some code
fi

Mengapa?

Filip Ekberg
sumber

Jawaban:

295

Masalah Anda muncul dari fakta yang $imemiliki 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 $ikosong atau, bahkan lebih ilustratif, asumsikan itu $iadalah sekumpulan ruang! Shell akan diganti $isebagai 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 $ijika $ikosong, sebagai berikut:

if [ "${i:-0}" -ge 2 ] ; then ...

Ini akan menggantikan nilai 0 bukan $iadalah $itidak terdefinisi. Saya masih mempertahankan tanda kutip karena, sekali lagi, jika $iada 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.

vladr
sumber
7
variabel kutipan akan memunculkan kesalahan baru seperti ekspresi integer yang diharapkan
Néstor
@ Néstor salah , mengutip variabel TIDAK akan memunculkan kesalahan baru seperti ekspresi integer yang diharapkan jika variabel tersebut numerik; memberikan nilai variabel non-numerik, baik dikutip maupun tidak, akan mengakibatkan kesalahan tersebut.
vladr
6

Dilihat dari pesan kesalahan nilai i adalah string kosong saat Anda mengeksekusinya, bukan 0.

starblue
sumber
6

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.

((...)) adalah perintah aritmatika, yang mengembalikan status keluar dari 0 jika ekspresinya bukan nol, atau 1 jika ekspresinya nol. Juga digunakan sebagai sinonim untuk "biarkan", jika efek samping (tugas) diperlukan.

Lihat: ArithmeticExpression

Roman Newaza
sumber
2

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.

Fernando Miguélez
sumber