คุณจะตรวจสอบว่า$*
ว่างเปล่าได้อย่างไร ในคำอื่น ๆ วิธีการตรวจสอบว่าไม่มีข้อโต้แย้งให้กับคำสั่ง?
คุณจะตรวจสอบว่า$*
ว่างเปล่าได้อย่างไร ในคำอื่น ๆ วิธีการตรวจสอบว่าไม่มีข้อโต้แย้งให้กับคำสั่ง?
คำตอบ:
ในการตรวจสอบว่าไม่มีการขัดแย้งกับคำสั่งให้ตรวจสอบค่าของ$#
ตัวแปรแล้ว
if [ $# -eq 0 ]; then
echo "No arguments provided"
exit 1
fi
หากคุณต้องการใช้$*
( ไม่ต้องการ ) แล้ว
if [ "$*" == "" ]; then
echo "No arguments provided"
exit 1
fi
คำอธิบายบางอย่าง:
วิธีที่สองไม่เป็นที่นิยมเนื่องจากในการขยายพารามิเตอร์ตำแหน่ง*
ขยายไปยังพารามิเตอร์ตำแหน่งเริ่มต้นจากหนึ่ง เมื่อการขยายเกิดขึ้นภายในเครื่องหมายคำพูดคู่มันจะขยายเป็นคำเดียวโดยมีค่าของแต่ละพารามิเตอร์คั่นด้วยอักขระตัวแรกของตัวแปรพิเศษของ IFS นั่นหมายถึงการสร้างสตริง ดังนั้นจึงมีค่าใช้จ่ายเพิ่มเติม
ในทางกลับกัน#
จะขยายจำนวนพารามิเตอร์ตำแหน่ง
ตัวอย่าง:
$ command param1 param2
ที่นี่
ค่าของ$#
คือ 2 และค่าของ$*
คือสตริง "param1 param2" (โดยไม่ใส่เครื่องหมายอัญประกาศ) หาก IFS ไม่ได้ตั้งค่าไว้ เนื่องจากถ้า IFS ไม่ได้ตั้งค่าพารามิเตอร์จะถูกคั่นด้วยช่องว่าง
สำหรับรายละเอียดเพิ่มเติมman bash
และอ่านหัวข้อชื่อพารามิเตอร์พิเศษ
[ $# -eq 0 ]
เป็นรูปแบบที่พบบ่อยที่สุด IME มีกรณีขอบที่"$#"
สามารถว่างเปล่า: หากมีข้อโต้แย้งเดียวซึ่งเป็นที่ว่างเปล่าหรือถ้ามีข้อโต้แย้งที่ว่างเปล่าหลายและ$IFS
ว่างเปล่า
"$*"
แสดงออกนอกจากนี้ยังจะมีการประเมินไป""
ถ้ามีเพียงหนึ่ง""
พารามิเตอร์ก็ผ่านไปได้ แต่ส่วนใหญ่คุณอาจไม่สนใจอยู่ดี
bash
นั่นหมายความว่าคุณไม่ได้ใช้ คุณใช้sh
เพื่อรันสคริปต์ AFAIK จะใช้ได้เฉพาะใน==
bash
หากคุณสนใจเพียงการประกันตัวหากมีข้อโต้แย้งใด ๆ หายไปการทดแทนพารามิเตอร์นั้นยอดเยี่ยม:
#!/bin/bash
# usage-message.sh
: ${1?"Usage: $0 ARGUMENT"}
# Script exits here if command-line parameter absent,
#+ with following error message.
# usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
นี่เป็นหนึ่งในวิธีที่คุณสามารถรู้ได้ว่าคุณไม่ได้รับข้อโต้แย้งใด ๆ
NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
{do something}
fi
if ! (($#)); ...
หรือif (($# == 0)); ...
หรือif [ $# -eq 0 ]; ...
หรือ! (($#)) && ...
หรือ(($#)) || ...