Ich habe folgende Funktion:
bar() { echo $1:$2; }
Ich rufe diese Funktion von einer anderen Funktion auf foo
. foo
selbst heißt wie folgt:
foo "This is" a test
Ich möchte folgende Ausgabe erhalten:
This is:a
Das heißt, die Argumente, die bar
empfangen werden, sollten die gleichen Token sein, an die ich weitergebe foo
.
Wie muss foo
dies umgesetzt werden? Ich habe die folgenden zwei Implementierungen ausprobiert, aber keine funktioniert:
foo() { bar $*; }
- Ausgabe:
this:is
foo() { bar "$*"; }
- Ausgabe:
this is a test:
Meine Frage ist effektiv, wie ich das Zitieren von Argumenten bewahren kann. Ist das überhaupt möglich?
Antworten:
Verwendung
"$@"
:"$@"
und"$*"
haben besondere Bedeutungen:"$@"
wird auf mehrere Wörter erweitert, ohne Erweiterungen für die Wörter (wie"$1" "$2" ...
) durchzuführen ."$*"
Verbindet Positionsparameter mit dem ersten Zeichen in IFS (oder Leerzeichen, wenn IFS nicht gesetzt ist, oder nichts, wenn IFS leer ist).quelle
$*
diese Semantik vorhanden war - jetzt ist es logisch. Ich denke, diese Antwort löst tatsächlich ein anderes Problem, das ich beim Durchlaufen von Arrays hatte ...Sie müssen
$@
anstelle von verwenden$*
Ausgabe
Warum funktioniert es?
Da mit
$*
alle Parameter als ein einzelnes Wort betrachtet werden , bedeutet dies, dass SieThis is a test
zurbar
Funktion übergehen . In diesem Fall ist der erste Parameter, der an die Funktionsleiste übergeben wirdThis
, der zweiteis
.Mit
$@
jedem Parameter ist ein String in Anführungszeichen , bedeutet es , dass Sie passieren'This is'
'a'
'test'
zubar
funtion. Der erste Parameterübergang zur Funktionsleiste ist also derThis is
zweitea
.quelle