2010-12-12 9 views
131

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

To co mam obecnie:

#!/bin/bash 
i=0 
for var in "[email protected]" 
do 
    i=i+1 
done 

Czy istnieją inne (lepsze) sposoby to zrobić?

+3

Ten kod po prostu przechowywać ciągiem znaków 'I + 1 'w zmiennej' I' czy jakieś argumenty są obecne. – Philipp

+0

@TheConstructor: wystarczy spojrzeć na rekord OP, tj. 2 posty w ciągu blisko 5,5 roku i tylko bierne gromadzenie karmy (95% z tego w tym pytaniu). Naprawdę nie sądzę, żeby mógł być uważany za aktywnego użytkownika lub, że daje kapryśny okrzyk o przyznawaniu akceptowanej odpowiedzi każdemu, kto pomógł. Jego pytanie było całkowicie uzasadnione i pomogło innym, którzy mają podobny brak praktyki w robieniu 'man bash'. Tak więc, żyj i pozwól żyć ;-) – Cbhihe

+0

@Cbhihe Myślałem, że wtedy spróbuję. OP może wciąż czytać i widzieć powiadomienie. Mam "unusung hero" -badge i zwykle nie próbuję przypominać o tym, że akceptuję moją odpowiedź. Byłbym jednak dumny, gdyby któryś z nich w końcu przyjął moją odpowiedź. – TheConstructor

Odpowiedz

219

liczba argumentów jest $#

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

+14

Aby wyjaśnić: w przeciwieństwie do 'argc' w językach podobnych do C,' $ # 'będzie miało wartość" 0 ", jeśli nie ma argumentów przekazanych do skryptu,' 1' jeśli istnieje jeden argument, itd. –

82
#!/bin/bash 
echo "The number of arguments is: $#" 
a=${@} 
echo "The total length of all arguments is: ${#a}: " 
count=0 
for var in "[email protected]" 
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" 
+4

+1 dla działającego przykład! miło – MountainX

+0

Pomogło mi też, co próbowałem zrobić; #!/Bin/bash count = 0 suma = 0 Średnia = 0 do var w "$ @" zrobić ((suma + = $ var)) ((count ++)) wykonanej ((avg = suma/$ count)) echo "suma liczb to: $ sum" echo "średnia z liczb to: $ avg" , która pomaga mi uzyskać nieokreśloną liczbę argumentów i zrobić trochę matematyki (możesz edytuj operand) Dzięki za Dennisa Williamsona, zrobiłem to. Piszę do kodu, ponieważ może to być przydatne dla kogoś. –

+1

@ kaanyılmaz: Jedyny problem polega na tym, że Bash robi tylko arytmetyczną liczbę całkowitą. Jeśli chcesz mieć ułamki dziesiętne, będziesz musiał użyć AWK, 'bc' lub czegoś innego (ksh93 i zsh również mogą robić dziesiętną matematykę). Twój kod zawiera znaki dolara dla niektórych zmiennych, ale nie dla innych. Powinieneś być konsekwentny w używaniu ich lub nie. Wewnątrz '(())' nie są konieczne. Są one jednak w stwierdzeniach "echo". –

-4

że wartość jest zawarta w zmiennej $#

+2

Niezależnie od tego, że jest prawie dokładnie ta sama (ale poprawna) odpowiedź, która ma 4 lata, twoja odpowiedź jest błędna - powinna być '$ #' – nachteil

1

Poniżej jest łatwa -

cat countvariable.sh

echo "[email protected]" |awk '{for(i=0;i<=NF;i++); print i-1 }' 

wyjściowa:

#./countvariable.sh 1 2 3 4 5 6 
6 
#./countvariable.sh 1 2 3 4 5 6 apple orange 
8 
+0

Może być napisana jako 'echo" $ @ "| awk '{print NF}' ' – user000001

Powiązane problemy