รหัสต่อไปนี้ให้
[: -ge: ตัวดำเนินการ unary ที่คาดไว้
เมื่อไหร่
i=0
if [ $i -ge 2 ]
then
#some code
fi
ทำไม?
รหัสต่อไปนี้ให้
[: -ge: ตัวดำเนินการ unary ที่คาดไว้
เมื่อไหร่
i=0
if [ $i -ge 2 ]
then
#some code
fi
ทำไม?
คำตอบ:
ปัญหาของคุณเกิดจากข้อเท็จจริงที่$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 และคุณจะพบปัญหาอีกครั้ง
โปรดอ่านสิ่งนี้เมื่อคุณมีเวลา เชลล์ได้รับการปฏิบัติเหมือนเป็นกล่องดำโดยหลายคน แต่มันทำงานด้วยกฎน้อยมากและง่ายมาก - เมื่อคุณทราบว่ากฎเหล่านั้นคืออะไร (หนึ่งในนั้นคือวิธีที่ตัวแปรทำงานในเชลล์ดังที่อธิบายไว้ด้านบน) เชลล์จะ ไม่มีความลับอีกต่อไปสำหรับคุณ
การตัดสินจากข้อความแสดงข้อผิดพลาดค่าของ i คือสตริงว่างเมื่อคุณดำเนินการไม่ใช่ 0
ฉันต้องการเพิ่ม 5 เซนต์ของฉัน ฉันเห็นทุกคนใช้[
หรือ[[
แต่มันก็คุ้มที่จะพูดถึงว่าพวกเขาไม่ได้เป็นส่วนหนึ่งของถ้าไวยากรณ์
สำหรับการเปรียบเทียบทางคณิตศาสตร์ให้ใช้((...))
แทน
((... )) เป็นคำสั่งทางคณิตศาสตร์ซึ่งส่งกลับสถานะการออกเป็น 0 ถ้านิพจน์นั้นไม่ใช่ศูนย์หรือ 1 ถ้านิพจน์นั้นเป็นศูนย์ นอกจากนี้ยังใช้เป็นคำพ้องสำหรับ "ให้" หากต้องการผลข้างเคียง (การมอบหมาย)
ดูที่: เลขคณิต Expression
ส่วนของสคริปต์ของคุณใช้งานได้ดีมาก คุณแน่ใจหรือว่าคุณไม่ได้มอบหมายสิ่งอื่นใดก่อนหน้าคำว่า "i"?
ข้อผิดพลาดทั่วไปคือการไม่เว้นช่องว่างหลังและก่อนวงเล็บเหลี่ยม