คุณจะตรวจสอบว่า$*ว่างเปล่าได้อย่างไร ในคำอื่น ๆ วิธีการตรวจสอบว่าไม่มีข้อโต้แย้งให้กับคำสั่ง?
คุณจะตรวจสอบว่า$*ว่างเปล่าได้อย่างไร ในคำอื่น ๆ วิธีการตรวจสอบว่าไม่มีข้อโต้แย้งให้กับคำสั่ง?
คำตอบ:
ในการตรวจสอบว่าไม่มีการขัดแย้งกับคำสั่งให้ตรวจสอบค่าของ$#ตัวแปรแล้ว
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 ]; ...หรือ! (($#)) && ...หรือ(($#)) || ...