Was ist der Unterschied zwischen [email protected]
und $*
in UNIX? Wenn sie in einem Skript wiedergegeben werden, scheinen beide die gleiche Ausgabe zu produzieren.
Antwort
Ein Unterschied besteht darin, wie sie die IFS-Variable am Ausgang handhaben.
#!/bin/sh
echo "unquoted asterisk " $*
echo "quoted asterisk $*"
echo "unquoted at " [email protected]
echo "quoted at [email protected]"
IFS="X"
echo "IFS is now $IFS"
echo "unquoted asterisk " $*
echo "quoted asterisk $*"
echo "unquoted at " [email protected]
echo "quoted at [email protected]"
Wenn Sie dies wie folgt ausführen: ./demo abc def ghi
, erhalten Sie diese Ausgabe:
unquoted asterisk abc def ghi
quoted asterisk abc def ghi
unquoted at abc def ghi
quoted at abc def ghi
IFS is now X
unquoted asterisk abc def ghi
quoted asterisk abcXdefXghi
unquoted at abc def ghi
quoted at abc def ghi
Beachten Sie, dass (nur) die „zitierte Stern“ Linie ein X zwischen jedem „Wort“ zeigt nach IFS
ist geändert zu "X". Wenn der Wert IFS
mehrere Zeichen enthält, wird nur das erste Zeichen für diesen Zweck verwendet.
Diese Funktion kann auch für andere Arrays verwendet werden:
$ array=(123 456 789)
$ saveIFS=$IFS; IFS="|"
$ echo "${array[*]}"
123|456|789
$ IFS=$saveIFS
Bitte beachten Sie die bash man Seite unter Spezielle Parameter.
Special Parameters
The shell treats several parameters specially. These parameters may
only be referenced; assignment to them is not allowed.
* Expands to the positional parameters, starting from one. When
the expansion occurs within double quotes, it expands to a sin‐
gle word with the value of each parameter separated by the first
character of the IFS special variable. That is, "$*" is equiva‐
lent to "$1c$2c...", where c is the first character of the value
of the IFS variable. If IFS is unset, the parameters are sepa‐
rated by spaces. If IFS is null, the parameters are joined
without intervening separators.
@ Expands to the positional parameters, starting from one. When
the expansion occurs within double quotes, each parameter
expands to a separate word. That is, "[email protected]" is equivalent to "$1"
"$2" ... If the double-quoted expansion occurs within a word,
the expansion of the first parameter is joined with the begin‐
ning part of the original word, and the expansion of the last
parameter is joined with the last part of the original word.
When there are no positional parameters, "[email protected]" and [email protected] expand to
nothing (i.e., they are removed).
Es ist sicherer, "[email protected]"
statt $*
zu verwenden. Wenn Sie Multiword-Zeichenfolgen als Argumente für ein Shell-Skript verwenden, interpretiert nur "[email protected]"
jedes zitierte Argument als separates Argument.
Wie die obige Ausgabe vorschlägt, wenn Sie $*
verwenden, macht die Shell eine falsche Anzahl der Argumente.
for i in "[email protected]"
do
echo $i # loop $# times
done
for i in "$*"
do
echo $i # loop 1 times
done
- 1. Was ist der Unterschied zwischen „$ a“ und ein in Unix $
- 2. Was ist der Unterschied zwischen Linux- und Unix-Befehlen?
- 3. Unix: Was ist der Unterschied zwischen Quelle und Export?
- 4. Was ist der Unterschied zwischen $ (()) und Ausdruck?
- 5. Was ist der Unterschied zwischen `==` und `ist`?
- 6. Was ist der Unterschied zwischen/* ... */und/** ... */
- 7. Was ist der Unterschied zwischen + = und = +?
- 8. Was ist der Unterschied zwischen:.! und: r !?
- 9. Was ist der Unterschied zwischen Verilog! und ~?
- 10. Was ist der Unterschied zwischen Difftime und '-'?
- 11. Was ist der Unterschied zwischen $ und $$?
- 12. was ist der Unterschied zwischen [[], []] und [[]] * 2
- 13. Was ist der Unterschied zwischen `&` und `ref`?
- 14. Was ist der Unterschied zwischen $ (...) und `...`
- 15. Was ist der Unterschied zwischen .Equals und ==
- 16. Was ist der Unterschied zwischen "$^N" und "$ +"?
- 17. Was ist der Unterschied zwischen? und ? = Nil
- 18. Was ist der Unterschied zwischen:
- 19. Was ist der Unterschied zwischen libsqlite3.dylib und libsqlite3.0.dylib?
- 20. Was ist der Unterschied zwischen: und :: und ::: in Javascript Grammatik
- 21. Was ist der Unterschied zwischen add und [] in der Wörterbuchoperation
- 22. Was ist der Unterschied zwischen `-Contains` und` -In` in PowerShell?
- 23. Was ist der Unterschied zwischen der JSP und der JSTL?
- 24. Was ist der Unterschied zwischen ist - (void) und + (void) Methoden
- 25. Was ist der Unterschied zwischen PS1 und PROMPT_COMMAND ist
- 26. Was ist der Unterschied zwischen Task.Run ist() und Task.Factory.StartNew()
- 27. Was ist der Unterschied zwischen NetFx45WebLink und NetFx45RedistLink ist
- 28. Was ist der Unterschied zwischen .replace und -replace in Powershell?
- 29. Was ist der Unterschied zwischen Cholesky in numpy und scipy?
- 30. Was ist der Unterschied zwischen DataTemplate und DataContext in WPF?
Siehe [Wie über die Argumente in einem Bash-Skript iterieren] (http://stackoverflow.com/questions/255898/how-to-iterate-over-arguments-in-bash-script/256225# 256225). Diese Antwort deckt explizit die Unterschiede zwischen $ @ und $ * auf (auch wenn die Frage nicht gilt). Der entscheidende Unterschied liegt im Verhalten in Anführungszeichen - der Unterschied zwischen "$ *" und "$ @". –