ตัวถูกดำเนินการของการเปรียบเทียบตัวเลข-eq
, -gt
, -lt
, -ge
, -le
และ-ne
ถูกนำมาเป็นนิพจน์ทางคณิตศาสตร์ ด้วยข้อ จำกัด บางอย่างพวกเขายังคงต้องเป็นคำของคำเดี่ยว
พฤติกรรมของชื่อตัวแปรในนิพจน์เชิงคำนวณอธิบายไว้ในShell Arithmetic :
อนุญาตให้ใช้ตัวแปรเชลล์ในฐานะตัวถูกดำเนินการ การขยายพารามิเตอร์จะดำเนินการก่อนการแสดงออกของการประเมิน ภายในนิพจน์ตัวแปรเชลล์อาจถูกอ้างอิงด้วยชื่อโดยไม่ต้องใช้ไวยากรณ์การขยายพารามิเตอร์ ตัวแปรเชลล์ที่เป็นค่า null หรือ unset ประเมินเป็น 0 เมื่ออ้างอิงโดยชื่อโดยไม่ใช้ไวยากรณ์การขยายพารามิเตอร์
และนอกจากนี้ยังมี:
ค่าของตัวแปรจะถูกประเมินเป็นนิพจน์ทางคณิตศาสตร์เมื่อมีการอ้างอิง
แต่ฉันไม่สามารถหาส่วนของเอกสารที่กล่าวว่าการเปรียบเทียบเชิงตัวเลขใช้การแสดงออกทางคณิตศาสตร์ มันไม่ได้อธิบายไว้ในเงื่อนไข Constructsใต้[[
และไม่เป็นมันอธิบายไว้ในทุบตีเงื่อนไขการแสดงออก
แต่จากการทดลองดูเหมือนว่าจะทำงานได้ดังที่ได้กล่าวไว้ข้างต้น
ดังนั้นสิ่งนี้ทำงาน:
a=6
[[ a -eq 6 ]] && echo y
[[ 1+2+3 -eq 6 ]] && echo y
[[ "1 + 2 + 3" -eq 6 ]] && echo y
สิ่งนี้ด้วย (ค่าของตัวแปรถูกประเมิน):
b='1 + 2 + 3'
[[ b -eq 6 ]] && echo y
แต่นี่ไม่ใช่ ไม่ใช่คำเดียวของเชลล์เมื่อ[[ .. ]]
วิเคราะห์คำดังนั้นมีข้อผิดพลาดทางไวยากรณ์ในเงื่อนไข:
[[ 1 + 2 + 3 -eq 6 ]] && echo y
ในบริบททางคณิตศาสตร์อื่น ๆ ไม่จำเป็นต้องมีนิพจน์ที่ไม่มีช่องว่าง สิ่งนี้จะพิมพ์ออก999
มาในขณะที่เครื่องหมายวงเล็บแบ่งเขตนิพจน์ทางคณิตศาสตร์ในดัชนีอย่างไม่น่าสงสัย:
a[6]=999; echo ${a[1 + 2 + 3]}
ในทางตรงกันข้ามการ=
เปรียบเทียบคือการจับคู่รูปแบบและไม่เกี่ยวข้องกับคณิตศาสตร์และการขยายตัวของตัวแปรอัตโนมัติที่ทำในบริบททางคณิตศาสตร์ (โครงสร้างตามเงื่อนไข):
เมื่อใช้ตัวดำเนินการ==
และ!=
ตัวดำเนินการสตริงทางด้านขวาของตัวดำเนินการจะถือเป็นรูปแบบและจับคู่ตามกฎที่อธิบายไว้ด้านล่างในการจับคู่รูปแบบราวกับว่าเปิดใช้งานตัวเลือกเปลือก extglob ประกอบเป็นเหมือน=
==
ดังนั้นนี่เป็นเท็จเนื่องจากสตริงแตกต่างกันอย่างเห็นได้ชัด:
[[ "1 + 2 + 3" = 6 ]]
เช่นนี้แม้ว่าค่าตัวเลขจะเท่ากัน:
[[ 6 = 06 ]]
และที่นี่ด้วยการเปรียบเทียบสตริง ( x
และ6
) มีความแตกต่าง:
x=6
[[ x = 6 ]]
สิ่งนี้จะขยายตัวแปรแม้ว่านี่จะเป็นจริง:
x=6
[[ $x = 6 ]]
x=1
ตามมาด้วย[[ x -gt 2]]
?