ฉันจะหาจำนวนข้อโต้แย้งที่ส่งผ่านไปยังสคริปต์ Bash ได้อย่างไร
นี่คือสิ่งที่ฉันมีในปัจจุบัน:
#!/bin/bash
i=0
for var in "$@"
do
i=i+1
done
มีวิธีอื่นในการทำเช่นนี้อีกหรือไม่
ฉันจะหาจำนวนข้อโต้แย้งที่ส่งผ่านไปยังสคริปต์ Bash ได้อย่างไร
นี่คือสิ่งที่ฉันมีในปัจจุบัน:
#!/bin/bash
i=0
for var in "$@"
do
i=i+1
done
มีวิธีอื่นในการทำเช่นนี้อีกหรือไม่
คำตอบ:
จำนวนข้อโต้แย้งคือ $#
ค้นหาในหน้านี้เพื่อเรียนรู้เพิ่มเติม: http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST
argc
ภาษาที่เหมือน C $#
จะเป็น0
ถ้าไม่มีข้อโต้แย้งที่ส่งผ่านไปยังสคริปต์1
หากมีข้อโต้แย้งอย่างใดอย่างหนึ่ง ฯลฯ
#!/bin/bash
echo "The number of arguments is: $#"
a=${@}
echo "The total length of all arguments is: ${#a}: "
count=0
for var in "$@"
do
echo "The length of argument '$var' is: ${#var}"
(( count++ ))
(( accum += ${#var} ))
done
echo "The counted number of arguments is: $count"
echo "The accumulated length of all arguments is: $accum"
bc
หรืออย่างอื่น (ksh93 และ zsh สามารถทำคณิตศาสตร์ทศนิยมได้เช่นกัน) รหัสของคุณมีเครื่องหมายดอลลาร์สำหรับตัวแปรบางตัว แต่ไม่ใช่รหัสอื่น คุณควรจะสอดคล้องกับการใช้พวกเขาหรือไม่ ข้างใน(())
พวกเขาไม่จำเป็น อย่างไรก็ตามพวกเขาอยู่ในecho
งบ
เพื่อเพิ่มการอ้างอิงเดิม:
$#
คุณจะได้รับจำนวนของการขัดแย้งจากพารามิเตอร์พิเศษ ค่า 0 หมายถึง "ไม่มีข้อโต้แย้ง" $#
เป็นแบบอ่านอย่างเดียว
เมื่อใช้ร่วมกับshift
การประมวลผลอาร์กิวเมนต์พารามิเตอร์พิเศษ$#
จะลดลงทุกครั้งที่shift
มีการเรียกใช้งานBash Builtin
ดูคู่มืออ้างอิง Bashในส่วน3.4.2 พารามิเตอร์พิเศษ :
"เชลล์ปฏิบัติต่อพารามิเตอร์หลายตัวเป็นพิเศษพารามิเตอร์เหล่านี้อาจถูกอ้างอิงเท่านั้น "
และในส่วนนี้สำหรับคำหลัก$ # "ขยายจำนวนพารามิเตอร์ตำแหน่งเป็นทศนิยม"
ด้านล่างเป็นสิ่งที่ง่าย -
cat countvariable.sh
echo "$@" |awk '{for(i=0;i<=NF;i++); print i-1 }'
ผลผลิต:
#./countvariable.sh 1 2 3 4 5 6
6
#./countvariable.sh 1 2 3 4 5 6 apple orange
8
echo "$@" | awk '{print NF}'
ค่านั้นมีอยู่ในตัวแปร $#
$#
i+1
ในตัวแปรi
หากมีข้อโต้แย้งใด ๆ อยู่