In vielen SO-Fragen und Bash-Tutorials sehe ich, dass ich auf Befehlszeilenargumente in Bash-Skripten auf zwei Arten zugreifen kann:
$ ~ >cat testargs.sh
#!/bin/bash
echo "you passed me" $*
echo "you passed me" $@
Was in ... resultiert:
$ ~> bash testargs.sh arg1 arg2
you passed me arg1 arg2
you passed me arg1 arg2
Was ist der Unterschied zwischen $*
und $@
?
Wann sollte man das erstere verwenden und wann soll man das letztere verwenden?
bash
command-line-arguments
Oz123
quelle
quelle
echo "something $@"
als Fehler behandeltAntworten:
Der Unterschied tritt auf, wenn die speziellen Parameter angegeben werden. Lassen Sie mich die Unterschiede veranschaulichen:
Ein weiteres Beispiel für die Wichtigkeit des Zitierens: Beachten Sie, dass zwischen "arg" und der Zahl zwei Leerzeichen stehen, aber wenn ich $ word nicht zitiere:
und in bash
"$@"
ist die "Standard" -Liste, über die iteriert werden soll:quelle
$*
oder"$*"
möglicherweise erforderlich, und der Zweck kann nicht von$@
oder"$@"
erfüllt werden?"$@"
mit den Anführungszeichen wählen .Eine schöne handliche Übersichtstabelle aus dem Bash Hackers Wiki :
Dabei steht
c
in der dritten Zeile das erste Zeichen des$IFS
internen Feldtrenners, einer Shell-Variablen.Wenn die Argumente in einer Skriptvariablen gespeichert werden sollen und die Argumente Leerzeichen enthalten sollen, empfehle ich von ganzem Herzen, einen
"$*"
Trick$IFS
anzuwenden, bei dem das interne Feldtrennzeichen auf tab gesetzt ist .quelle
$IFS
steht für "Internal Field Separator".$ *
$ @
Quelle: Bash Man
quelle
$ @ ist dasselbe wie $ *, aber jeder Parameter ist eine Zeichenfolge in Anführungszeichen, dh die Parameter werden ohne Interpretation oder Erweiterung intakt weitergegeben. Dies bedeutet unter anderem, dass jeder Parameter in der Argumentliste als separates Wort betrachtet wird.
Natürlich sollte "$ @" in Anführungszeichen gesetzt werden.
http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST
quelle
In diesem Beispiel können wir den Unterschied zwischen "at" und "asterix" hervorheben, während wir sie verwenden. Ich habe zwei Arrays als "Obst" und "Gemüse" deklariert.
Siehe folgendes Ergebnis im obigen Code:
quelle