Was bedeutet ein Dollarzeichen gefolgt von einem At-Zeichen (@
) in einem Shell-Skript bedeuten?
Zum Beispiel:
umbrella_corp_options [email protected]
[email protected]
Ist alle der Parameter, die an das Skript übergeben werden.
Wenn Sie beispielsweise ./someScript.sh foo bar
Aufrufen, ist [email protected]
Gleich foo bar
.
Wenn Sie tun:
./someScript.sh foo bar
und dann innerhalb der Referenz someScript.sh
:
umbrella_corp_options "[email protected]"
dies wird an umbrella_corp_options
übergeben, wobei jeder einzelne Parameter in doppelte Anführungszeichen eingeschlossen wird. Auf diese Weise können Parameter mit Leerzeichen vom Aufrufer übernommen und weitergegeben werden.
[email protected]
Ist fast dasselbe wie $*
Und bedeutet "alle Befehlszeilenargumente". Sie werden oft verwendet, um alle Argumente einfach an ein anderes Programm zu übergeben (und so einen Wrapper um dieses andere Programm zu bilden).
Der Unterschied zwischen den beiden Syntaxen wird sichtbar, wenn Sie ein Argument mit Leerzeichen (z. B.) haben und [email protected]
In doppelte Anführungszeichen setzen:
wrappedProgram "[email protected]"
# ^^^ this is correct and will hand over all arguments in the way
# we received them, i. e. as several arguments, each of them
# containing all the spaces and other uglinesses they have.
wrappedProgram "$*"
# ^^^ this will hand over exactly one argument, containing all
# original arguments, separated by single spaces.
wrappedProgram $*
# ^^^ this will join all arguments by single spaces as well and
# will then split the string as the Shell does on the command
# line, thus it will split an argument containing spaces into
# several arguments.
Beispiel: Anrufen
wrapper "one two three" four five "six seven"
wird darin enden, dass:
"[email protected]": wrappedProgram "one two three" four five "six seven"
"$*": wrappedProgram "one two three four five six seven"
^^^^ These spaces are part of the first
argument and are not changed.
$*: wrappedProgram one two three four five six seven
Dies sind die Befehlszeilenargumente, bei denen:
[email protected]
= speichert alle Argumente in einer Stringliste$*
= speichert alle Argumente als einzelne Zeichenfolge$#
= speichert die Anzahl der Argumente
Die Verwendung eines reinen [email protected]
bedeutet in den meisten Fällen "den Programmierer so schwer wie möglich verletzen", da dies in den meisten Fällen zu Problemen mit der Worttrennung und mit Leerzeichen und anderen Zeichen in Argumenten führt.
In (erratenen) 99% aller Fälle muss es in "
: "[email protected]"
kann verwendet werden, um die Argumente zuverlässig zu durchlaufen.
for a in "[email protected]"; do something_with "$a"; done
@
Erweitert die Positionsparameter, beginnend mit eins. Wenn die Erweiterung in doppelten Anführungszeichen erfolgt, wird jeder Parameter zu einem separaten Wort erweitert. Das heißt, "$ @" entspricht "$ 1" "$ 2" .... Wenn die Erweiterung in doppelten Anführungszeichen in einem Word auftritt, wird die Erweiterung des ersten Parameters mit dem Anfangsteil des ursprünglichen Words und dem Die Erweiterung des letzten Parameters wird mit dem letzten Teil des ursprünglichen Words verbunden. Wenn keine Positionsparameter vorhanden sind, werden "$ @" und $ @ zu nichts erweitert (d. H. Sie werden entfernt).