368 Stimmen

Was bedeutet $@ in einem Shell-Skript?

Was bedeutet ein Dollarzeichen gefolgt von einem at-Zeichen ( @ ) in einem Shell-Skript bedeuten?

Zum Beispiel:

umbrella_corp_options $@

419voto

Har Punkte 4234

$@ 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.

198voto

Alfe Punkte 51658

$@ 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

65voto

Sameer Duwal Punkte 611

Dies sind die Befehlszeilenargumente, bei denen:

$@ = speichert alle Argumente in einer Liste von Zeichenketten
$* = speichert alle Argumente als eine einzige Zeichenkette
$# = speichert die Anzahl der Argumente

18voto

glglgl Punkte 84928

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

16voto

Luis Lavaire. Punkte 475

Bedeutung.

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.com

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.

Powered by:

X