El $@
wird auf alle durch Leerzeichen getrennten Befehlszeilenparameter erweitert. Hier ist ein Beispiel.
abc "$@"
Bei der Verwendung von $@
sollten Sie (fast) immer in Anführungszeichen setzen, um zu vermeiden, dass Argumente, die Leerzeichen oder Platzhalter enthalten, falsch interpretiert werden (siehe unten). Dies funktioniert für mehrere Argumente. Es ist auch auf alle POSIX-kompatiblen Shells portierbar.
Es ist auch erwähnenswert, dass $0
(im Allgemeinen der Name oder der Pfad des Skripts) nicht in $@
.
El Bash-Referenzhandbuch Abschnitt Spezielle Parameter sagt, dass $@
expandiert zu den Positionsparametern, beginnend bei eins. Wenn die Expansion innerhalb von doppelten Anführungszeichen erfolgt, wird jeder Parameter zu einem separaten Wort expandiert. Das bedeutet "$@"
ist gleichbedeutend mit "$1" "$2" "$3"...
.
Weitergabe un peu de Argumente:
Wenn Sie Folgendes bestehen wollen alle bis auf den ersten Argumenten können Sie zunächst mit shift
um das erste Argument zu "verbrauchen" und dann "$@"
um die restlichen Argumente an einen anderen Befehl zu übergeben. In der bash (und zsh und ksh, aber nicht in einfachen POSIX-Shells wie dash) können Sie dies tun, ohne die Argumentliste durcheinander zu bringen, indem Sie eine Variante des Array-Slicing verwenden: "${@:3}"
liefert Ihnen die Argumente, die mit "$3"
. "${@:3:4}"
erhalten Sie bis zu vier Argumente, beginnend bei "$3"
(d.h. "$3" "$4" "$5" "$6"
), wenn so viele Argumente übergeben wurden.
Dinge, die Sie wahrscheinlich nicht tun wollen:
"$*"
gibt alle Argumente in einer einzigen Zeichenkette wieder (getrennt durch Leerzeichen, oder was auch immer das erste Zeichen von $IFS
ist). Dadurch wird die Unterscheidung zwischen Räumen innerhalb Argumente und die Leerzeichen zwischen Argumente, ist also generell eine schlechte Idee. Obwohl es für das Drucken der Argumente in Ordnung sein könnte, z.B. echo "$*"
vorausgesetzt, es ist Ihnen nicht wichtig, den Raum innerhalb/zwischen den Unterscheidungen zu bewahren.
Zuweisung der Argumente an eine reguläre Variable (wie in args="$@"
) fügt alle Argumente zusammen wie "$*"
tut. Wenn Sie die Argumente in einer Variablen speichern wollen, verwenden Sie ein Array mit args=("$@")
(durch die Klammern handelt es sich um ein Array), und verweisen Sie dann auf sie, z. B. "${args[0]}"
usw. Beachten Sie, dass in bash und ksh Array-Indizes bei 0 beginnen, also $1
wird in args[0]
usw. zsh hingegen beginnt die Array-Indizes bei 1, so dass $1
wird in args[1]
. Und einfachere Shells wie Dash haben überhaupt keine Arrays.
Die Anführungszeichen weglassen, entweder mit $@
ou $*
versucht, jedes Argument in einzelne Wörter aufzuteilen (basierend auf Leerzeichen oder was auch immer in $IFS
) und versuchen außerdem, alles, was wie ein Platzhalter für einen Dateinamen aussieht, in eine Liste passender Dateinamen zu erweitern. Dies kann wirklich seltsame Auswirkungen haben und sollte fast immer vermieden werden. (Außer in zsh, wo diese Expansion standardmäßig nicht stattfindet).
3 Stimmen
Mögliches Duplikat von Alle Argumente in einem Bash-Shell-Skript weitergeben . (Diese Frage wurde eigentlich vor der hier verlinkten Frage gestellt. Aber die Frage im Link hat detailliertere Antworten und einen informativeren Titel und eignet sich vielleicht besser als Referenzfrage)