Wie finde ich die Anzahl der Argumente, die an ein Bash-Skript übergeben wurden?

182

Wie finde ich die Anzahl der Argumente, die an ein Bash-Skript übergeben wurden?

Folgendes habe ich derzeit:

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

Gibt es andere (bessere) Möglichkeiten, dies zu tun?

Sabri
quelle
4
Dieser Code würde einfach die Literalzeichenfolge i+1in der Variablen speichern , iwenn Argumente vorhanden sind.
Philipp
Verwandte: stackoverflow.com/questions/18568706/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

Antworten:

279

Die Anzahl der Argumente ist $#

Suchen Sie auf dieser Seite danach, um mehr zu erfahren: http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST

zsalzbank
quelle
36
Zur Verdeutlichung: Anders als argcin C-ähnlichen Sprachen $#wird es sein, 0wenn keine Argumente an das Skript übergeben werden, 1wenn es ein Argument gibt usw.
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"
Bis auf weiteres angehalten.
quelle
Es hat mir auch geholfen, was ich versucht habe zu tun; #! / bin / bash count = 0 sum = 0 avg = 0 für var in "$ @" do ((sum + = $ var)) ((count ++)) done ((avg = sum / $ count)) echo " Die Summe der Zahlen ist: $ sum "echo" Durchschnitt der Zahlen ist: $ avg ", was mir hilft, unbekannte Zahlen von Argumenten zu erhalten und etwas zu rechnen (Sie können den Operanden bearbeiten). Danke für Dennis Williamson, ich habe es getan. Ich poste in Code, weil es für jemanden nützlich sein kann.
Kaan Yılmaz
1
@ kaanyılmaz: Das einzige Problem dabei ist, dass Bash nur ganzzahlige Arithmetik macht. Wenn Sie Dezimalstellen möchten, müssen Sie AWK bcoder etwas anderes verwenden (ksh93 und zsh können auch Dezimalrechnungen durchführen). Ihr Code enthält Dollarzeichen für einige Variablen, andere jedoch nicht. Sie sollten konsequent sein, ob Sie sie verwenden oder nicht. Im Inneren sind (())sie nicht notwendig. Sie sind jedoch in den echoAussagen.
Bis auf weiteres angehalten.
Ich bin nicht sehr gut mit Linux, ich habe nur Ihren Code nach Bedarf geändert. Es ist im Grunde Ihr Code
kaan yılmaz
Danke für den Code, es ist sehr gut.
Smeterlink
12

um die ursprüngliche Referenz hinzuzufügen:

Die Anzahl der Argumente können Sie dem speziellen Parameter entnehmen $#. Der Wert 0 bedeutet "keine Argumente". $#ist schreibgeschützt.

In Verbindung mit shiftfür die Argumentverarbeitung wird der spezielle Parameter $#jedes Mal dekrementiert, wenn Bash Builtin shiftausgeführt wird.

siehe Bash-Referenzhandbuch in Abschnitt 3.4.2 Spezielle Parameter :

  • "Die Shell behandelt mehrere Parameter speziell. Auf diese Parameter darf nur verwiesen werden. "

  • und in diesem Abschnitt für das Schlüsselwort $ # "Wird auf die Anzahl der Positionsparameter in Dezimalzahl erweitert."

Michael Brux
quelle
-1

Unten ist die einfache -

cat countvariable.sh

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

Ausgabe :

#./countvariable.sh 1 2 3 4 5 6
6
#./countvariable.sh 1 2 3 4 5 6 apple orange
8
VIPIN KUMAR
quelle
3
Könnte geschrieben werden alsecho "$@" | awk '{print NF}'
user000001
-6

Dieser Wert ist in der Variablen enthalten $#

Jeff Gaer
quelle
4
Abgesehen von der Tatsache, dass es fast genau die gleiche (aber richtige) Antwort gibt, die 4 Jahre alt ist, ist Ihre Antwort falsch - es sollte sein$#
wird