เวิร์กสเตชันออนไลน์ของ OnWorks Linux และ Windows

โลโก้

ฟรีโฮสติ้งออนไลน์สำหรับเวิร์กสเตชัน

<ก่อนหน้านี้ | 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 ]


ซึ่งให้จำนวนอาร์กิวเมนต์ที่ถูกต้อง นอกจากสตริงว่างแล้ว ควรใช้เครื่องหมายคำพูดในกรณีที่ค่าสามารถขยายเป็นสตริงที่มีหลายคำได้ เช่นเดียวกับชื่อไฟล์ที่มีช่องว่างฝังตัว


ระบบปฏิบัติการคลาวด์คอมพิวติ้งยอดนิยมที่ OnWorks: