Was bedeutet ein Dollarzeichen gefolgt von einem at-Zeichen ( @
) in einem Shell-Skript bedeuten?
Zum Beispiel:
umbrella_corp_options $@
Was bedeutet ein Dollarzeichen gefolgt von einem at-Zeichen ( @
) in einem Shell-Skript bedeuten?
Zum Beispiel:
umbrella_corp_options $@
$@
est alle der an das Skript übergebenen Parameter.
Wenn Sie zum Beispiel ./someScript.sh foo bar
puis $@
wird gleich sein foo bar
.
Wenn Sie das tun:
./someScript.sh foo bar
und dann innen someScript.sh
Hinweis:
umbrella_corp_options "$@"
wird dies an umbrella_corp_options
wobei jeder einzelne Parameter in doppelte Anführungszeichen gesetzt wird, so dass Parameter mit Leerzeichen vom Aufrufer übernommen und weitergegeben werden können.
$@
ist fast dasselbe wie $*
, beide bedeuten "alle Befehlszeilenargumente". Sie werden oft verwendet, um einfach alle Argumente an ein anderes Programm zu übergeben (und bilden so einen Wrapper um dieses andere Programm).
Der Unterschied zwischen den beiden Syntaxen wird deutlich, wenn Sie ein Argument mit Leerzeichen haben (z. B.) und $@
in doppelten Anführungszeichen:
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: Aufruf von
wrapper "one two three" four five "six seven"
zur Folge haben wird:
"$@": 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
Die Verwendung eines reinen $@
bedeutet in den meisten Fällen "dem Programmierer so weh tun, wie es nur geht", weil es in den meisten Fällen zu Problemen mit der Worttrennung und mit Leerzeichen und anderen Zeichen in Argumenten führt.
In (schätzungsweise) 99 % aller Fälle ist es erforderlich, sie in "
: "$@"
ist das, was verwendet werden kann, um zuverlässig über die Argumente zu iterieren.
for a in "$@"; do something_with "$a"; done
Kurz gefasst, $@
erstreckt sich auf die Argumente die vom Aufrufer an eine Funktion oder eine Skript . Seine Bedeutung ist kontextabhängig : Innerhalb einer Funktion expandiert er zu den Argumenten, die an diese Funktion übergeben werden. Wenn er in einem Skript (außerhalb einer Funktion) verwendet wird, erweitert er sich zu den Argumenten, die dem Skript übergeben werden.
$ cat my-script
#! /bin/sh
echo "$@"
$ ./my-script "Hi!"
Hi!
$ put () { echo "$@"; }
$ put "Hi!"
Hi!
* Hinweis: Worttrennung.
Die Shell teilt die Token auf der Grundlage des Inhalts des Feldes IFS
Umgebungsvariable. Ihr Standardwert ist \t\n
d.h. Leerzeichen, Tabulator und Zeilenumbruch. Erweitern von "$@"
gibt Ihnen eine tadellose Kopie der übergebenen Argumente. Erweitern von $@
darf nicht. Genauer gesagt, alle Argumente, die Zeichen enthalten, die in IFS
kann in zwei oder mehr Argumente aufgeteilt oder abgeschnitten werden.
Daher werden Sie in den meisten Fällen Folgendes verwenden wollen "$@"
, nicht $@
.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.