Operan dari perbandingan numerik -eq
, -gt
, -lt
, -ge
, -le
dan-ne
diambil sebagai ekspresi aritmatika. Dengan beberapa batasan, mereka masih perlu kata-kata shell tunggal.
Perilaku nama variabel dalam ekspresi aritmatika dijelaskan dalam Aritmatika Shell :
Variabel Shell diizinkan sebagai operan; ekspansi parameter dilakukan sebelum ekspresi dievaluasi. Di dalam ekspresi, variabel shell juga dapat dirujuk oleh nama tanpa menggunakan sintaks ekspansi parameter. Variabel shell yang nol atau tidak disetel bernilai 0 ketika direferensikan oleh nama tanpa menggunakan sintaks ekspansi parameter.
dan juga:
Nilai variabel dievaluasi sebagai ekspresi aritmatika ketika direferensikan
Tetapi saya tidak dapat menemukan bagian dari dokumentasi di mana dikatakan bahwa perbandingan numerik mengambil ekspresi aritmatika. Itu tidak dijelaskan dalam Konstruk Kondisional di bawah [[
, juga tidak dijelaskan dalam Ekspresi Bersyarat Bash .
Tetapi, dengan eksperimen, tampaknya berfungsi seperti yang dikatakan di atas.
Jadi, hal-hal seperti ini berfungsi:
a=6
[[ a -eq 6 ]] && echo y
[[ 1+2+3 -eq 6 ]] && echo y
[[ "1 + 2 + 3" -eq 6 ]] && echo y
ini juga (nilai variabel dievaluasi):
b='1 + 2 + 3'
[[ b -eq 6 ]] && echo y
Tetapi ini tidak; itu bukan kata shell tunggal ketika [[ .. ]]
diuraikan, jadi ada kesalahan sintaksis dalam kondisi:
[[ 1 + 2 + 3 -eq 6 ]] && echo y
Dalam konteks aritmatika lainnya, ekspresi tidak perlu tanpa spasi putih. Ini mencetak 999
, karena tanda kurung secara jelas membatasi ekspresi aritmatika dalam indeks:
a[6]=999; echo ${a[1 + 2 + 3]}
Di sisi lain, =
perbandingannya adalah kecocokan pola , dan tidak melibatkan aritmatika, maupun ekspansi variabel otomatis yang dilakukan dalam konteks aritmatika (Konstruk Kondisional):
Kapan ==
dan!=
operator digunakan, string di sebelah kanan operator dianggap sebagai pola dan dicocokkan sesuai dengan aturan yang dijelaskan di bawah dalam Pencocokan Pola, seolah-olah opsi cangkang extglob diaktifkan. The =
operator adalah identik dengan ==
.
Jadi ini salah karena senarnya jelas berbeda:
[[ "1 + 2 + 3" = 6 ]]
seperti ini, meskipun nilai numeriknya sama:
[[ 6 = 06 ]]
dan di sini juga, senar ( x
dan6
) dibandingkan, mereka berbeda:
x=6
[[ x = 6 ]]
Ini akan memperluas variabel, jadi ini benar:
x=6
[[ $x = 6 ]]
x=1
diikuti[[ x -gt 2]]
?