Bagaimana cara menemukan jumlah argumen yang diteruskan ke skrip Bash?

182

Bagaimana cara menemukan jumlah argumen yang diteruskan ke skrip Bash?

Inilah yang saya miliki saat ini:

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

Apakah ada cara lain yang lebih baik untuk melakukan ini?

sabri
sumber
4
Kode itu hanya akan menyimpan string literal i+1dalam variabel ijika ada argumen.
Philipp
terkait: stackoverflow.com/questions/18568706/…
Ciro Santilli 郝海东 冠状 病 六四 六四 事件 法轮功

Jawaban:

279

Jumlah argumen adalah $#

Cari di halaman ini untuk mempelajari lebih lanjut: http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST

zsalzbank
sumber
36
Untuk memperjelas: tidak seperti argcdalam bahasa C-like, $#akan terjadi 0jika tidak ada argumen yang diteruskan ke skrip, 1jika ada satu argumen, dll.
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"
Dijeda sampai pemberitahuan lebih lanjut.
sumber
Itu membantu saya juga, yang saya coba lakukan adalah; #! / bin / hitungan bash = 0 jumlah = 0 rata-rata = 0 untuk var di "$ @" do ((jumlah + = $ var)) ((jumlah ++)) selesai ((rata-rata = jumlah / $ jumlah)) gema " jumlah angka-angka adalah: $ jumlah "gema" rata-rata angka-angka adalah: $ rata-rata "yang membantu saya untuk mendapatkan jumlah args yang tidak diketahui dan melakukan beberapa matematika (Anda dapat mengedit operan) Terima kasih untuk Dennis Williamson, saya melakukannya. Saya memposting ke kode karena mungkin bermanfaat bagi seseorang.
kaan yılmaz
1
@ kaanyılmaz: Satu-satunya masalah dengan itu adalah bahwa Bash hanya melakukan aritmatika integer. Jika Anda ingin desimal, Anda harus menggunakan AWK bc,, atau yang lainnya (ksh93 dan zsh juga bisa melakukan matematika desimal). Kode Anda termasuk tanda dolar untuk beberapa variabel, tetapi tidak yang lain. Anda harus konsisten dalam menggunakannya atau tidak. Di dalam (())mereka tidak perlu. Mereka, bagaimanapun, dalam echopernyataan.
Dijeda sampai pemberitahuan lebih lanjut.
Saya tidak terlalu baik dengan linux, saya baru saja memodifikasi kode Anda seperti yang saya butuhkan. Ini pada dasarnya adalah kode Anda
kaan yılmaz
Terima kasih untuk kodenya, ini sangat bagus.
Smeterlink
12

untuk menambahkan referensi asli:

Anda bisa mendapatkan jumlah argumen dari parameter khusus $#. Nilai 0 berarti "tidak ada argumen". $#hanya baca.

Ketika digunakan bersama dengan shiftuntuk pemrosesan argumen, parameter khusus $#dikurangi setiap kali Bash Builtin shiftdijalankan.

lihat Manual Referensi Bash di bagian 3.4.2 Parameter Khusus :

  • "Shell memperlakukan beberapa parameter secara khusus. Parameter ini hanya dapat dirujuk "

  • dan di bagian ini untuk kata kunci $ # "Perluas jumlah parameter posisi dalam desimal."

Michael Brux
sumber
-1

Di bawah ini adalah yang mudah -

cat countvariable.sh

echo "$@" |awk '{for(i=0;i<=NF;i++); print i-1 }'

Output:

#./countvariable.sh 1 2 3 4 5 6
6
#./countvariable.sh 1 2 3 4 5 6 apple orange
8
VIPIN KUMAR
sumber
3
Dapat ditulis sebagaiecho "$@" | awk '{print NF}'
user000001
-6

nilai itu terkandung dalam variabel $#

Jeff Gaer
sumber
4
Terlepas dari kenyataan ada jawaban yang hampir sama (tapi benar) yang berumur 4 tahun, jawaban Anda salah - seharusnya$#
nachteil