Sayısal karşılaştırmaların işlenenler -eq
, -gt
, -lt
, -ge
, -le
ve -ne
aritmetik ifadeler olarak alınır. Bazı sınırlamalarla, yine de tek kabuklu kelimeler olmaları gerekir.
Değişken adlarının aritmetik ifadedeki davranışı Kabuk Aritmetiği'nde açıklanmıştır :
Kabuk değişkenlerine işlenen olarak izin verilir; parametre genişletmesi, ifade değerlendirilmeden önce gerçekleştirilir. Bir ifade içinde, kabuk değişkenlerine parametre genişletme sözdizimi kullanılmadan ada göre de başvurulabilir. Null veya unset olan bir kabuk değişkeni, parametre genişletme sözdizimi kullanılmadan adıyla başvurulduğunda 0 olarak değerlendirilir.
ve ayrıca:
Değişkenin değeri, başvurulduğunda aritmetik bir ifade olarak değerlendirilir
Ancak, sayısal karşılaştırmaların aritmetik ifadeler aldığı söylenen belgelerin bir kısmını bulamıyorum. Bu tarif değil Şartlı Yapıtlarının altında [[
, ne de açıklanan Bash Koşullu İfadeler .
Ancak, deney yoluyla, yukarıda belirtildiği gibi çalışıyor gibi görünüyor.
Yani, bunun gibi şeyler çalışır:
a=6
[[ a -eq 6 ]] && echo y
[[ 1+2+3 -eq 6 ]] && echo y
[[ "1 + 2 + 3" -eq 6 ]] && echo y
bu da (değişkenin değeri değerlendirilir):
b='1 + 2 + 3'
[[ b -eq 6 ]] && echo y
Ama bu olmaz; [[ .. ]]
ayrıştırıldığında tek bir kabuk sözcüğü değildir , bu nedenle koşulda bir sözdizimi hatası vardır:
[[ 1 + 2 + 3 -eq 6 ]] && echo y
Diğer aritmetik bağlamlarda, ifadenin boşluk olmadan olmasına gerek yoktur. 999
Köşeli parantezler dizindeki aritmetik ifadeyi açıkça sınırladığı için bu yazdırılır :
a[6]=999; echo ${a[1 + 2 + 3]}
Öte yandan, =
karşılaştırma bir kalıp eşleşmesidir ve aritmetik veya aritmetik bağlamda yapılan otomatik değişken genişleme (Koşullu Yapılar) içermez:
Ne zaman ==
ve !=
operatörler kullanılır extglob kabuk seçeneği etkin sanki, operatörün sağındaki dize, Kalıp Eşleme aşağıda açıklanan kurallara göre bir model olarak kabul edilir ve eşleştirilir. =
Operatör ile aynıdır ==
.
Dizeler açıkça farklı olduğu için bu yanlıştır:
[[ "1 + 2 + 3" = 6 ]]
sayısal değerler aynı olmasına rağmen şu şekilde:
[[ 6 = 06 ]]
ve burada da dizeler ( x
ve 6
) karşılaştırılıyor, farklılar:
x=6
[[ x = 6 ]]
Bu, değişkeni genişletir, bu yüzden bu doğrudur:
x=6
[[ $x = 6 ]]
x=1
izledi[[ x -gt 2]]
?