จะตรวจสอบว่าไม่มีพารามิเตอร์ให้กับคำสั่งได้อย่างไร?


คำตอบ:


110

ในการตรวจสอบว่าไม่มีการขัดแย้งกับคำสั่งให้ตรวจสอบค่าของ$#ตัวแปรแล้ว

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และอ่านหัวข้อชื่อพารามิเตอร์พิเศษ


5
หรือif ! (($#)); ...หรือif (($# == 0)); ...หรือif [ $# -eq 0 ]; ...หรือ! (($#)) && ...หรือ(($#)) || ...
nicerobot

7
[ $# -eq 0 ]เป็นรูปแบบที่พบบ่อยที่สุด IME มีกรณีขอบที่"$#"สามารถว่างเปล่า: หากมีข้อโต้แย้งเดียวซึ่งเป็นที่ว่างเปล่าหรือถ้ามีข้อโต้แย้งที่ว่างเปล่าหลายและ$IFSว่างเปล่า
Gilles

1
"$*"แสดงออกนอกจากนี้ยังจะมีการประเมินไป""ถ้ามีเพียงหนึ่ง""พารามิเตอร์ก็ผ่านไปได้ แต่ส่วนใหญ่คุณอาจไม่สนใจอยู่ดี
จัดการ

ฉันเชื่อว่าควรเป็น = แทนที่จะเป็น == ... ขณะนี้ฉันได้รับข้อผิดพลาดของผู้ให้บริการที่ไม่คาดคิดและการเปลี่ยนเป็น = ช่วยแก้ปัญหา
จริงแล้ว

@Charlotte bashนั่นหมายความว่าคุณไม่ได้ใช้ คุณใช้shเพื่อรันสคริปต์ AFAIK จะใช้ได้เฉพาะใน== bash
Sachin Divekar

14

หากคุณสนใจเพียงการประกันตัวหากมีข้อโต้แย้งใด ๆ หายไปการทดแทนพารามิเตอร์นั้นยอดเยี่ยม:

#!/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

-4

นี่เป็นหนึ่งในวิธีที่คุณสามารถรู้ได้ว่าคุณไม่ได้รับข้อโต้แย้งใด ๆ

NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
    {do something}
fi

5
ที่ดูเหมือนว่าจะเป็นวิธีที่ซับซ้อนในการทำสิ่งที่เป็นคำตอบที่ได้รับการยอมรับเขียน 5 ปีที่ผ่านมา ....
เจฟฟ์ Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.