<ก่อนหน้านี้ | Contents | ถัดไป>
การขยายที่ไม่คาดคิด
อาจมีข้อผิดพลาดที่เกิดขึ้นเป็นระยะๆ ในสคริปต์เท่านั้น บางครั้งสคริปต์จะทำงานได้ดีและบางครั้งอาจล้มเหลวเนื่องจากผลของการขยาย หากเราเปลี่ยนเครื่องหมายอัฒภาคที่หายไปและเปลี่ยนค่าของ จำนวน เป็นตัวแปรว่าง เรา
สามารถสาธิต:
#! / bin / ทุบตี
# ปัญหา: สคริปต์เพื่อแสดงข้อผิดพลาดทั่วไป
ตัวเลข=
ถ้า [ $number = 1 ]; แล้ว
echo "จำนวนเท่ากับ 1" อื่น
echo "จำนวนไม่เท่ากับ 1"
fi
#! / bin / ทุบตี
# ปัญหา: สคริปต์เพื่อแสดงข้อผิดพลาดทั่วไป
ตัวเลข=
ถ้า [ $number = 1 ]; แล้ว
echo "จำนวนเท่ากับ 1" อื่น
echo "จำนวนไม่เท่ากับ 1"
fi
การรันสคริปต์ด้วยการเปลี่ยนแปลงนี้ส่งผลให้เกิดผลลัพธ์:
[me@linuxbox ~]$ ปัญหา
/home/me/bin/trouble: บรรทัดที่ 7: [: =: ตัวดำเนินการ unary ที่คาดไว้ Number ไม่เท่ากับ 1
[me@linuxbox ~]$ ปัญหา
/home/me/bin/trouble: บรรทัดที่ 7: [: =: ตัวดำเนินการ unary ที่คาดไว้ Number ไม่เท่ากับ 1
เราได้รับข้อความแสดงข้อผิดพลาดที่ค่อนข้างคลุมเครือ ตามด้วยผลลัพธ์ของวินาที เสียงสะท้อน สั่งการ. ปัญหาคือการขยายตัวของ จำนวน ตัวแปรภายใน ทดสอบ สั่งการ. เมื่อคำสั่ง:
[ หมายเลข $ = 1 ]
[ หมายเลข $ = 1 ]
ผ่านการขยายด้วย จำนวน ว่างเปล่า ผลลัพธ์คือ:
[ = 1 ]
[ = 1 ]
ซึ่งไม่ถูกต้องและเกิดข้อผิดพลาดขึ้น NS = ตัวดำเนินการคือตัวดำเนินการไบนารี (ต้องใช้ค่าในแต่ละด้าน) แต่ค่าแรกหายไป ดังนั้น ทดสอบ คำสั่งคาดหวังโอเปอเรเตอร์เอก (เช่น -z) แทนที่. นอกจากนี้ เนื่องจาก ทดสอบ ล้มเหลว (เนื่องจากข้อผิดพลาด), the if คำสั่งได้รับรหัสทางออกที่ไม่ใช่ศูนย์และดำเนินการตามนั้นและวินาที เสียงสะท้อน คำสั่งถูกดำเนินการ
ปัญหานี้สามารถแก้ไขได้โดยการเพิ่มเครื่องหมายคำพูดรอบอาร์กิวเมนต์แรกใน ทดสอบ
คำสั่ง:
[ "$ หมายเลข" = 1 ]
[ "$ หมายเลข" = 1 ]
จากนั้นเมื่อเกิดการขยายตัว ผลลัพธ์จะเป็นดังนี้:
[ "" = 1 ]
[ "" = 1 ]
ซึ่งให้จำนวนอาร์กิวเมนต์ที่ถูกต้อง นอกจากสตริงว่างแล้ว ควรใช้เครื่องหมายคำพูดในกรณีที่ค่าสามารถขยายเป็นสตริงที่มีหลายคำได้ เช่นเดียวกับชื่อไฟล์ที่มีช่องว่างฝังตัว