เช่นเดียวกับคำสั่งง่ายๆอื่น ๆ[ ... ]หรือ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 มาตรฐานคุณไม่ต้องการเงามัน