ฉันจะตรวจสอบจำนวนข้อโต้แย้งที่ถูกต้องได้อย่างไร (ข้อโต้แย้งหนึ่งข้อ) หากมีคนพยายามเรียกใช้สคริปต์โดยไม่ผ่านจำนวนอาร์กิวเมนต์ที่ถูกต้องและตรวจสอบเพื่อให้แน่ใจว่าอาร์กิวเมนต์บรรทัดคำสั่งมีอยู่จริงและเป็นไดเรกทอรี
ฉันจะตรวจสอบจำนวนข้อโต้แย้งที่ถูกต้องได้อย่างไร (ข้อโต้แย้งหนึ่งข้อ) หากมีคนพยายามเรียกใช้สคริปต์โดยไม่ผ่านจำนวนอาร์กิวเมนต์ที่ถูกต้องและตรวจสอบเพื่อให้แน่ใจว่าอาร์กิวเมนต์บรรทัดคำสั่งมีอยู่จริงและเป็นไดเรกทอรี
คำตอบ:
#!/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
if [ "$#" -ne 1 ] ; then
หรือif ! [ -d "$1" ]; then
เพื่อดูว่าข้อที่เป็นสาเหตุของปัญหา
-d
เกี่ยวข้อง หากคุณต้องการเพิ่มการตรวจสอบแยกคุณสามารถใช้-e
เพื่อตรวจสอบการมีอยู่
-e
ผลตอบแทนจริงถ้าไฟล์ที่มีอยู่ ฉันเพิ่มการรายงานข้อผิดพลาดที่เป็นมิตรกับคำตอบ
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
คุณสามารถตรวจสอบจำนวนอาร์กิวเมนต์ทั้งหมดที่ส่งผ่านในบรรทัดคำสั่งด้วย" $#
"
พูดเพื่อตัวอย่างชื่อเชลล์สคริปต์ของฉัน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
shell
นั่นหมายความว่า/bin/sh