it-swarm.com.de

Was ist der Unterschied zwischen $ @ und $ *?

Laut diese Seite machen $ @ und $ * so ziemlich dasselbe:

The [email protected] holds list of all arguments passed to the script. 
The $* holds list of all arguments passed to the script.

Nachdem ich alle Top-Treffer in Google durchsucht habe, kann ich keine Erklärung finden, warum es zwei scheinbar doppelte Syntaxen geben würde.

Sie scheinen in meinen Skripten gleich zu funktionieren.

cat foo.sh
#!/bin/bash
echo The parameters passed in are [email protected]
echo The parameters passed in are $*

./foo.sh herp derp
The parameters passed in are herp derp
The parameters passed in are herp derp
  1. Wird einer dem anderen vorgezogen?
  2. Warum gibt es 2 eingebaute Variablen, um genau dasselbe zu tun?

Zusätzliche Quellen
bash.cyberciti.biz

70
spuder

Sie sind nicht gleich. $* Ist eine einzelne Zeichenfolge, während [email protected] Ein tatsächliches Array ist. Um den Unterschied zu erkennen, führen Sie das folgende Skript folgendermaßen aus:

 > ./test.sh one two "three four"

Das Skript:

#!/bin/bash

echo "Using \"\$*\":"
for a in "$*"; do
    echo $a;
done

echo -e "\nUsing \$*:"
for a in $*; do
    echo $a;
done

echo -e "\nUsing \"\[email protected]\":"
for a in "[email protected]"; do
    echo $a;
done

echo -e "\nUsing \[email protected]:"
for a in [email protected]; do
    echo $a;
done              

Die vier Fälle sind:

Using "$*":
one two three four

Hier werden die Parameter als eine lange Zeichenfolge in Anführungszeichen betrachtet. Nicht zitiert:

Using $*:
one
two
three
four

Die Zeichenfolge wird durch die for -Schleife in Wörter unterteilt.

Using "[email protected]":
one
two
three four

Dies behandelt jedes Element von $ @ als Zeichenfolge in Anführungszeichen.

Using $@:
one
two
three
four

Dadurch wird jedes Element als nicht zitierte Zeichenfolge behandelt, sodass die letzte Zeichenfolge erneut durch for three four Geteilt wird.

100
goldilocks

Der Unterschied besteht darin, wie sie erweitert werden.

$* wird zu einem einzigen Argument erweitert, wobei alle Elemente durch Leerzeichen begrenzt sind (eigentlich das erste Zeichen von $IFS).
[email protected] wird auf mehrere Argumente erweitert.

Zum Beispiel

#!/bin/bash
echo "With *:"
for arg in "$*"; do echo "<$arg>"; done
echo
echo "With @:"
for arg in "[email protected]"; do echo "<$arg>"; done

$ /tmp/test.sh 1  2 "3  4"
With *:
<1 2 3  4>

With @:
<1>
<2>
<3  4>
14
Patrick

Weitere Informationen finden Sie unter Bash Beginners Guide . Diese tun so ziemlich dasselbe mit dem Unterschied, wie es getrennt ist:

$* - Erweitert ab eins auf die Positionsparameter. Wenn die Erweiterung in doppelten Anführungszeichen erfolgt, wird sie zu einem einzelnen Wort erweitert, wobei der Wert jedes Parameters durch das erste Zeichen der IFS-Spezialvariablen getrennt ist.

[email protected] - Erweitert ab eins auf die Positionsparameter. Wenn die Erweiterung in doppelten Anführungszeichen erfolgt, wird jeder Parameter zu einem separaten Word erweitert.

Aber wenn Sie IFS nicht auf einen anderen Wert als den Standardwert setzen, könnte es identisch aussehen.

3
Karlson

Wird einer dem anderen vorgezogen?

Eine kurze Antwort lautet "[email protected]".

Wenn Sie sie ohne doppeltes Anführungszeichen verwenden, sind sie gleich. In diesem Fall wird niemand dem anderen vorgezogen. Aber ich schlage vor, dass Sie sie immer mit doppeltem Anführungszeichen verwenden, außer Sie wissen, was genau Sie wollen.

Warum gibt es 2 eingebaute Variablen, um genau dasselbe zu tun?

Es gibt keinen Unterschied zwischen $* und [email protected], aber "[email protected]" und "$*" haben.

Sie können meine Antwort in dieser Beitrag sehen, um zu sehen, wie sie sich unterscheiden.

1
cuonglm