ฉันจะหาจำนวนข้อโต้แย้งที่ส่งผ่านไปยังสคริปต์ Bash ได้อย่างไร


182

ฉันจะหาจำนวนข้อโต้แย้งที่ส่งผ่านไปยังสคริปต์ Bash ได้อย่างไร

นี่คือสิ่งที่ฉันมีในปัจจุบัน:

#!/bin/bash
i=0
for var in "$@"
do
  i=i+1
done

มีวิธีอื่นในการทำเช่นนี้อีกหรือไม่


4
รหัสนั้นจะเก็บสตริงตัวอักษรi+1ในตัวแปรiหากมีข้อโต้แย้งใด ๆ อยู่
Philipp

คำตอบ:


279

จำนวนข้อโต้แย้งคือ $#

ค้นหาในหน้านี้เพื่อเรียนรู้เพิ่มเติม: http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST


36
เพื่อชี้แจง: แตกต่างจากargcภาษาที่เหมือน C $#จะเป็น0ถ้าไม่มีข้อโต้แย้งที่ส่งผ่านไปยังสคริปต์1หากมีข้อโต้แย้งอย่างใดอย่างหนึ่ง ฯลฯ
Vladimir Panteleev

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

มันช่วยฉันด้วยซึ่งฉันพยายามทำคือ; #! / bin / bash count = 0 sum = 0 avg = 0 สำหรับ var ใน "$ @" do (sum + = $ var)) ((count ++)) เสร็จแล้ว ((avg = sum / $ count)) echo " ผลรวมของตัวเลขคือ: $ sum "echo" ค่าเฉลี่ยของตัวเลขคือ: $ avg "ซึ่งช่วยให้ฉันได้จำนวน args ที่ไม่ทราบจำนวนและทำคณิตศาสตร์บางอย่าง (คุณสามารถแก้ไขตัวถูกดำเนินการ) ขอบคุณ Dennis Williamson ฉันทำแล้ว ฉันกำลังโพสต์รหัสเพราะอาจเป็นประโยชน์สำหรับใครบางคน
kanan yılmaz

1
@ kaanyılmaz: ปัญหาเดียวของ Bash คือการคำนวณเลขจำนวนเต็ม หากคุณต้องการทศนิยมคุณจะต้องใช้ AWK bcหรืออย่างอื่น (ksh93 และ zsh สามารถทำคณิตศาสตร์ทศนิยมได้เช่นกัน) รหัสของคุณมีเครื่องหมายดอลลาร์สำหรับตัวแปรบางตัว แต่ไม่ใช่รหัสอื่น คุณควรจะสอดคล้องกับการใช้พวกเขาหรือไม่ ข้างใน(())พวกเขาไม่จำเป็น อย่างไรก็ตามพวกเขาอยู่ในechoงบ
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

ฉันไม่ค่อยเก่งกับ linux ฉันแค่แก้ไขโค้ดของคุณตามที่ต้องการ มันเป็นรหัสของคุณโดยทั่วไป
kaan yılmaz

ขอบคุณสำหรับรหัสมันเป็นสิ่งที่ดีมาก
Smeterlink

12

เพื่อเพิ่มการอ้างอิงเดิม:

$#คุณจะได้รับจำนวนของการขัดแย้งจากพารามิเตอร์พิเศษ ค่า 0 หมายถึง "ไม่มีข้อโต้แย้ง" $#เป็นแบบอ่านอย่างเดียว

เมื่อใช้ร่วมกับshiftการประมวลผลอาร์กิวเมนต์พารามิเตอร์พิเศษ$#จะลดลงทุกครั้งที่shiftมีการเรียกใช้งานBash Builtin

ดูคู่มืออ้างอิง Bashในส่วน3.4.2 พารามิเตอร์พิเศษ :

  • "เชลล์ปฏิบัติต่อพารามิเตอร์หลายตัวเป็นพิเศษพารามิเตอร์เหล่านี้อาจถูกอ้างอิงเท่านั้น "

  • และในส่วนนี้สำหรับคำหลัก$ # "ขยายจำนวนพารามิเตอร์ตำแหน่งเป็นทศนิยม"


-1

ด้านล่างเป็นสิ่งที่ง่าย -

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

3
สามารถเขียนเป็นecho "$@" | awk '{print NF}'
user000001

-6

ค่านั้นมีอยู่ในตัวแปร $#


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