ตรวจสอบจำนวนอาร์กิวเมนต์ที่ถูกต้อง


147

ฉันจะตรวจสอบจำนวนข้อโต้แย้งที่ถูกต้องได้อย่างไร (ข้อโต้แย้งหนึ่งข้อ) หากมีคนพยายามเรียกใช้สคริปต์โดยไม่ผ่านจำนวนอาร์กิวเมนต์ที่ถูกต้องและตรวจสอบเพื่อให้แน่ใจว่าอาร์กิวเมนต์บรรทัดคำสั่งมีอยู่จริงและเป็นไดเรกทอรี


5
@Daniel shellนั่นหมายความว่า/bin/sh
Ruel

คำตอบ:


215
#!/bin/sh
if [ "$#" -ne 1 ] || ! [ -d "$1" ]; then
  echo "Usage: $0 DIRECTORY" >&2
  exit 1
fi

การแปล: หากจำนวนอาร์กิวเมนต์ไม่เท่ากับ (ตัวเลข) เท่ากับ 1 หรืออาร์กิวเมนต์แรกไม่ใช่ไดเรกทอรีให้ใช้เอาต์พุตไปยัง stderr และ exit ด้วยรหัสสถานะความล้มเหลว

การรายงานข้อผิดพลาดที่เป็นมิตรเพิ่มเติม:

#!/bin/sh
if [ "$#" -ne 1 ]; then
  echo "Usage: $0 DIRECTORY" >&2
  exit 1
fi
if ! [ -e "$1" ]; then
  echo "$1 not found" >&2
  exit 1
fi
if ! [ -d "$1" ]; then
  echo "$1 not a directory" >&2
  exit 1
fi

1
@Andrew K: บรรทัดใดที่รายงานสิ่งนี้ ถ้ามันเป็น "ถ้า" เส้นลองตัดออกจากหนึ่งในสองข้อทำให้มันเป็นอย่างใดอย่างหนึ่งif [ "$#" -ne 1 ] ; thenหรือif ! [ -d "$1" ]; thenเพื่อดูว่าข้อที่เป็นสาเหตุของปัญหา
Laurence Gonsalves

ฉันคิดว่ามันออกมาขอบคุณ ถ้าชื่อไฟล์ไม่มีอยู่ล่ะ?
Andrew K

ไม่มีอยู่ == ไม่ใช่ผู้อำนวยการเท่าที่-dเกี่ยวข้อง หากคุณต้องการเพิ่มการตรวจสอบแยกคุณสามารถใช้-eเพื่อตรวจสอบการมีอยู่
Laurence Gonsalves

ถ้า [-e "$ 1"] แล้ว echo "$ 1: ไม่มีไดเรกทอรีดังกล่าว" ออก 1 fi
Andrew K

@Andrew K: คุณต้องการสลับการตรวจสอบ -eผลตอบแทนจริงถ้าไฟล์ที่มีอยู่ ฉันเพิ่มการรายงานข้อผิดพลาดที่เป็นมิตรกับคำตอบ
Laurence Gonsalves

22

cat script.sh

    var1=$1
    var2=$2
    if [ "$#" -eq 2 ]
    then
            if [ -d $var1 ]
            then
            echo directory ${var1} exist
            else
            echo Directory ${var1} Does not exists
            fi
            if [ -d $var2 ]
            then
            echo directory ${var2} exist
            else
            echo Directory ${var2} Does not exists
            fi
    else
    echo "Arguments are not equals to 2"
    exit 1
    fi

ดำเนินการเหมือนด้านล่าง -

./script.sh directory1 directory2

ผลผลิตจะเป็นเช่น -

directory1 exit
directory2 Does not exists

14

คุณสามารถตรวจสอบจำนวนอาร์กิวเมนต์ทั้งหมดที่ส่งผ่านในบรรทัดคำสั่งด้วย" $#" พูดเพื่อตัวอย่างชื่อเชลล์สคริปต์ของฉันhello.sh

sh hello.sh hello-world
# I am passing hello-world as argument in command line which will b considered as 1 argument 
if [ $# -eq 1 ] 
then
    echo $1
else
    echo "invalid argument please pass only one argument "
fi

ผลผลิตจะได้ hello-world

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