Jak znaleźć liczbę argumentów przekazanych do skryptu Bash?

182

Jak znaleźć liczbę argumentów przekazanych do skryptu Bash?

Oto co mam obecnie:

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

Czy istnieją inne (lepsze) sposoby na zrobienie tego?

Sabri
źródło
4
Ten kod po prostu przechowałby literalny ciąg znaków i+1w zmiennej, ijeśli występują jakiekolwiek argumenty.
Filipiny,
powiązane: stackoverflow.com/questions/18568706/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

279

Liczba argumentów wynosi $#

Wyszukaj go na tej stronie, aby dowiedzieć się więcej: http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST

zsalzbank
źródło
36
Wyjaśnij: inaczej niż argcw językach podobnych do C, $#będzie, 0jeśli do skryptu nie zostaną przekazane żadne argumenty, 1jeśli jest jeden argument itp.
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"
Wstrzymano do odwołania.
źródło
Pomogło mi również, co starałem się zrobić; #! / bin / bash count = 0 sum = 0 avg = 0 for var in "$ @" do ((sum + = $ var)) ((count ++)) done ((avg = sum / $ count)) echo " suma liczb to: $ suma "echo" średnia liczb wynosi: $ avg ", co pomaga mi zdobyć nieznane liczby argumentów i zrobić matematykę (możesz edytować operand) Dzięki za Dennisa Williamsona, zrobiłem to. Wysyłam do kodu, ponieważ może być dla kogoś przydatny.
kaan yılmaz
1
@ kaanyılmaz: Jedynym problemem jest to, że Bash wykonuje tylko arytmetykę liczb całkowitych. Jeśli chcesz miejsc po przecinku, musisz użyć AWK bclub czegoś innego (ksh93 i zsh mogą również wykonywać obliczenia dziesiętne). Twój kod zawiera znaki dolara dla niektórych zmiennych, ale nie dla innych. Powinieneś być konsekwentny w korzystaniu z nich, czy nie. Wewnątrz (())nie są konieczne. Są jednak w echooświadczeniach.
Wstrzymano do odwołania.
Nie jestem zbyt dobry w Linuksie, właśnie zmodyfikowałem twój kod zgodnie z potrzebami. Zasadniczo jest to twój kod
kaan yılmaz
Dzięki za kod, jest bardzo dobry.
Smeterlink,
12

aby dodać oryginalne odniesienie:

Możesz uzyskać liczbę argumentów ze specjalnego parametru $#. Wartość 0 oznacza „brak argumentów”. $#jest tylko do odczytu.

W połączeniu z shiftprzetwarzaniem argumentów parametr specjalny $#jest zmniejszany za każdym razem, gdy shifturuchamiane jest wbudowane Bash .

patrz Podręcznik referencyjny Bash w rozdziale 3.4.2 Parametry specjalne :

  • „Powłoka traktuje kilka parametrów specjalnie. Do tych parametrów można się jedynie odnosić

  • oraz w tej sekcji dla słowa kluczowego $ # „rozwija się do liczby parametrów pozycyjnych w systemie dziesiętnym”.

Michael Brux
źródło
-1

Poniżej jest łatwy -

cat countvariable.sh

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

Wynik :

#./countvariable.sh 1 2 3 4 5 6
6
#./countvariable.sh 1 2 3 4 5 6 apple orange
8
VIPIN KUMAR
źródło
3
Można zapisać jakoecho "$@" | awk '{print NF}'
użytkownik000001
-6

ta wartość jest zawarta w zmiennej $#

Jeff Gaer
źródło
4
Poza tym, że jest prawie dokładnie taka sama (ale poprawna) odpowiedź, która ma 4 lata, twoja odpowiedź jest zła - powinna być$#
nachteil