เช่นเดียวกับคำสั่งง่ายๆอื่น ๆ[ ... ]
หรือtest
ต้องการเว้นวรรคระหว่างอาร์กิวเมนต์
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
หรือ
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
ข้อเสนอแนะ
เมื่ออยู่ใน Bash คุณควรใช้[[ ]]
แทนเพราะจะไม่ทำการแยกคำและขยายชื่อพา ธ ไปยังตัวแปรที่อาจไม่จำเป็นต้องมีการอ้างอิงเว้นแต่เป็นส่วนหนึ่งของการแสดงออก
[[ $# -ne 1 ]]
นอกจากนี้ยังมีคุณสมบัติอื่น ๆ เช่นการจัดกลุ่มเงื่อนไขที่ไม่ได้ระบุการจับคู่รูปแบบ (การจับคู่รูปแบบขยายด้วยextglob
) และการจับคู่ regex
ตัวอย่างต่อไปนี้ตรวจสอบว่าข้อโต้แย้งนั้นถูกต้องหรือไม่ อนุญาตให้มีอาร์กิวเมนต์เดียวหรือสองรายการ
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
สำหรับการแสดงออกทางคณิตศาสตร์บริสุทธิ์โดยใช้(( ))
บางส่วนอาจจะยังคงดีขึ้น แต่พวกเขายังคงเป็นไปได้ใน[[ ]]
กับผู้ประกอบการทางคณิตศาสตร์ที่มันต้องการ-eq
, -ne
, -lt
, -le
, -gt
หรือ-ge
โดยการวางการแสดงออกเป็นอาร์กิวเมนต์สายเดียว:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
มันจะมีประโยชน์ถ้าคุณจะต้องรวมมันกับคุณสมบัติอื่น ๆ ของ[[ ]]
เช่นกัน
ออกจากสคริปต์
นอกจากนี้ยังมีเหตุผลที่จะทำให้สคริปต์ออกเมื่อพารามิเตอร์ที่ไม่ถูกต้องถูกส่งผ่านไป สิ่งนี้ได้รับการแนะนำในความคิดเห็นโดยekangasแต่มีคนแก้ไขคำตอบนี้เพื่อให้มัน-1
เป็นค่าที่ส่งคืนดังนั้นฉันจึงอาจทำถูกต้อง
-1
แม้ว่าจะได้รับการยอมรับจาก Bash ว่าเป็นข้อโต้แย้งที่exit
ไม่ชัดเจนและไม่ถูกต้องที่จะใช้เป็นข้อเสนอแนะทั่วไป 64
นอกจากนี้ยังมีค่าที่สุดอย่างเป็นทางการตั้งแต่มันกำหนดไว้ในด้วยsysexits.h
#define EX_USAGE 64 /* command line usage error */
เครื่องมือส่วนใหญ่เช่นls
กลับ2
ด้วยอาร์กิวเมนต์ที่ไม่ถูกต้อง ฉันยังเคยกลับมา2
ในสคริปต์ของฉัน แต่เมื่อเร็ว ๆ นี้ฉันไม่ได้ใส่ใจจริงๆและใช้1
ในข้อผิดพลาดทั้งหมด แต่เรามาที่2
นี่เพราะมันเป็นเรื่องธรรมดาที่สุดและอาจไม่ใช่ระบบปฏิบัติการเฉพาะ
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters"
exit 2
fi
อ้างอิง
test
คุณไม่ควรตั้งชื่อสคริปต์ของคุณ นั่นคือชื่อของคำสั่ง Unix มาตรฐานคุณไม่ต้องการเงามัน