เปรียบเทียบจำนวนเต็มใน bash คาดว่าโอเปอเรเตอร์ unary


137

รหัสต่อไปนี้ให้

[: -ge: ตัวดำเนินการ unary ที่คาดไว้

เมื่อไหร่

i=0

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

ทำไม?

คำตอบ:


295

ปัญหาของคุณเกิดจากข้อเท็จจริงที่$iมีค่าว่างเมื่อคำสั่งของคุณล้มเหลว อ้างอิงตัวแปรของคุณทุกครั้งเมื่อทำการเปรียบเทียบหากมีโอกาสน้อยที่หนึ่งในนั้นอาจว่างเปล่าเช่น:

if [ "$i" -ge 2 ] ; then
  ...
fi

นี่เป็นเพราะวิธีที่เชลล์ใช้กับตัวแปร สมมติตัวอย่างดั้งเดิม

if [ $i -ge 2 ] ; then ...

สิ่งแรกที่เชลล์ทำเมื่อเรียกใช้โค้ดบรรทัดนั้นแทนค่า$iเช่นเดียวกับฟังก์ชั่นการค้นหาและแทนที่ของเอดิเตอร์ที่คุณโปรดปราน สมมติว่า$iมันว่างเปล่าหรือเป็นตัวอย่างที่มากกว่านั้นสมมติว่านั่น$iเป็นช่องว่าง! เชลล์จะแทนที่$iดังนี้:

if [     -ge 2 ] ; then ...

ตอนนี้แทนตัวแปรจะทำเงินเปลือกที่มีการเปรียบเทียบและล้มเหลว .... เพราะมันไม่สามารถมองเห็นเข้าใจอะไรไปทางด้านซ้าย-gtของ อย่างไรก็ตามการอ้างถึง$i:

if [ "$i" -ge 2 ] ; then ...

กลายเป็น:

if [ "    " -ge 2 ] ; then ...

ตอนนี้เชลล์มองเห็นเครื่องหมายคำพูดคู่และรู้ว่าคุณกำลังเปรียบเทียบช่องว่างสี่ช่องกับ 2 และจะข้ามifไป

คุณยังมีตัวเลือกในการระบุค่าเริ่มต้นสำหรับ$iถ้า$iว่างเปล่าดังต่อไปนี้:

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

นี้จะแทนค่า 0 แทน$iจะ$iไม่ได้กำหนด ฉันยังคงรักษาคำพูดเพราะอีกครั้งถ้า$iเป็นกลุ่มของช่องว่างนั้นจะไม่นับเป็นไม่ได้กำหนดจะไม่ถูกแทนที่ด้วย 0 และคุณจะพบปัญหาอีกครั้ง

โปรดอ่านสิ่งนี้เมื่อคุณมีเวลา เชลล์ได้รับการปฏิบัติเหมือนเป็นกล่องดำโดยหลายคน แต่มันทำงานด้วยกฎน้อยมากและง่ายมาก - เมื่อคุณทราบว่ากฎเหล่านั้นคืออะไร (หนึ่งในนั้นคือวิธีที่ตัวแปรทำงานในเชลล์ดังที่อธิบายไว้ด้านบน) เชลล์จะ ไม่มีความลับอีกต่อไปสำหรับคุณ


7
ตัวแปรการอ้างถึงจะทำให้เกิดข้อผิดพลาดใหม่เช่นนิพจน์จำนวนเต็ม
Néstor

@ ไม่ถูกต้องการอ้างอิงตัวแปรจะไม่ทำให้เกิดข้อผิดพลาดใหม่เช่นนิพจน์จำนวนเต็มที่คาดไว้หากตัวแปรนั้นเป็นตัวเลข การระบุค่าตัวแปรที่ไม่ใช่ตัวเลขไม่ว่าจะเป็นการเสนอราคาหรือไม่ก็ตามจะส่งผลให้เกิดข้อผิดพลาดดังกล่าว
vladr

6

การตัดสินจากข้อความแสดงข้อผิดพลาดค่าของ i คือสตริงว่างเมื่อคุณดำเนินการไม่ใช่ 0


6

ฉันต้องการเพิ่ม 5 เซนต์ของฉัน ฉันเห็นทุกคนใช้[หรือ[[แต่มันก็คุ้มที่จะพูดถึงว่าพวกเขาไม่ได้เป็นส่วนหนึ่งของถ้าไวยากรณ์

สำหรับการเปรียบเทียบทางคณิตศาสตร์ให้ใช้((...))แทน

((... )) เป็นคำสั่งทางคณิตศาสตร์ซึ่งส่งกลับสถานะการออกเป็น 0 ถ้านิพจน์นั้นไม่ใช่ศูนย์หรือ 1 ถ้านิพจน์นั้นเป็นศูนย์ นอกจากนี้ยังใช้เป็นคำพ้องสำหรับ "ให้" หากต้องการผลข้างเคียง (การมอบหมาย)

ดูที่: เลขคณิต Expression


2

ส่วนของสคริปต์ของคุณใช้งานได้ดีมาก คุณแน่ใจหรือว่าคุณไม่ได้มอบหมายสิ่งอื่นใดก่อนหน้าคำว่า "i"?

ข้อผิดพลาดทั่วไปคือการไม่เว้นช่องว่างหลังและก่อนวงเล็บเหลี่ยม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.