Was bedeutet ein Dollarzeichen gefolgt von einem at-Zeichen ( @
) in einem Shell-Skript?
Beispielsweise:
umbrella_corp_options $@
Was bedeutet ein Dollarzeichen gefolgt von einem at-Zeichen ( @
) in einem Shell-Skript?
Beispielsweise:
umbrella_corp_options $@
Antworten:
$@
sind alle an das Skript übergebenen Parameter.
Wenn Sie zum Beispiel anrufen, ./someScript.sh foo bar
ist $@
dies gleich foo bar
.
Wenn Sie tun:
./someScript.sh foo bar
und dann Insider- someScript.sh
Referenz:
umbrella_corp_options "$@"
Dies wird umbrella_corp_options
mit jedem einzelnen Parameter in doppelten Anführungszeichen übergeben, sodass Parameter mit Leerzeichen vom Aufrufer übernommen und weitergegeben werden können.
someScript.sh foo bar "boo far"
?
$@
kommt es nicht unbedingt von Parametern, die an das Skript übergeben wurden ... z. set a b "x y"; printf '(%s)' "$@"
Ausgänge(a)(b)(x y)
$@
und$*
$@
ist fast dasselbe wie $*
, beide bedeuten "alle Befehlszeilenargumente". Sie werden häufig verwendet, um einfach alle Argumente an ein anderes Programm zu übergeben (wodurch ein Wrapper um dieses andere Programm gebildet wird).
Der Unterschied zwischen den beiden Syntaxen wird angezeigt, wenn Sie ein Argument mit Leerzeichen (z. B.) $@
in doppelten Anführungszeichen setzen:
wrappedProgram "$@"
# ^^^ 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:
"$@": 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
wrappedProgram "$*"
-> separated by single spaces.
aber in Ihrem zweiten Beispiel sind sie nicht durch einzelne Leerzeichen getrennt.
Dies sind die Befehlszeilenargumente, bei denen:
$@
= speichert alle Argumente in einer Liste von Zeichenfolgen
$*
= speichert alle Argumente als einzelne Zeichenfolge
$#
= speichert die Anzahl der Argumente
Die Verwendung eines reinen $@
Mittels bedeutet in den meisten Fällen "den Programmierer so schwer wie möglich zu verletzen", da dies in den meisten Fällen zu Problemen bei der Worttrennung sowie bei Leerzeichen und anderen Zeichen in Argumenten führt.
In (erratenen) 99% aller Fälle ist es erforderlich, es in Folgendes einzuschließen "
: Dies "$@"
kann verwendet werden, um die Argumente zuverlässig zu durchlaufen.
for a in "$@"; do something_with "$a"; done
for a in start_token "$@" end_token; do something_with "$a"; done
@
Erweitert auf 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 innerhalb eines Wortes auftritt, wird die Erweiterung des ersten Parameters mit dem Anfangsteil des ursprünglichen Wortes und dem verbunden Die Erweiterung des letzten Parameters wird mit dem letzten Teil des ursprünglichen Wortes verbunden. Wenn keine Positionsparameter vorhanden sind, werden "$ @" und $ @ zu nichts erweitert (dh sie werden entfernt).
Kurz $@
gesagt , erweitert sich um die Positionsargumente, die vom Aufrufer an eine Funktion oder ein Skript übergeben werden . Seine Bedeutung ist kontextabhängig : Innerhalb einer Funktion wird es auf die Argumente erweitert, die an eine solche Funktion übergeben werden. Wenn es in einem Skript verwendet wird (nicht innerhalb des Bereichs einer Funktion), wird es auf die Argumente erweitert, die an ein solches Skript übergeben werden.
$ cat my-sh
#! /bin/sh
echo "$@"
$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!
Ein weiteres Thema, das für das Verständnis des Verhaltens $@
in der Shell von größter Bedeutung ist, ist die Wortteilung . Die Shell teilt Token basierend auf dem Inhalt der IFS
Variablen. Der Standardwert ist \t\n
; dh Leerzeichen, Tabulator und Zeilenumbruch.
Durch Erweitern erhalten "$@"
Sie eine makellose Kopie der übergebenen Argumente. Eine Erweiterung $@
wird jedoch nicht immer möglich sein. Insbesondere wenn die Argumente Zeichen von enthalten IFS
, werden sie aufgeteilt.
Meistens möchten Sie "$@"
nicht verwenden $@
.