Ich versuche, zitierte Parameter eines Bash-Skripts abzurufen, damit sie sicher von einem verschachtelten Skript empfangen werden können. Irgendwelche Ideen?
test.sh
#!/bin/bash
echo $*
bash myecho.sh $*
myecho.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
Stichprobe:
bash test.sh aaa bbb '"ccc ddd"'
Ergebnis:
aaa bbb "ccc ddd"
aaa
bbb
"ccc
ddd"
Gewünschtes Ergebnis
aaa bbb "ccc ddd"
aaa
bbb
ccc ddd
Antworten:
Beachten Sie, dass das Konstrukt "$ @" nicht bash-spezifisch ist und mit jeder POSIX-Shell funktionieren sollte (zumindest mit Bindestrich). Beachten Sie auch, dass Sie angesichts der gewünschten Ausgabe überhaupt keine zusätzliche Zitierstufe benötigen. IE ruft einfach das obige Skript wie folgt auf:
quelle
$@
ist in einer Funktion nicht verfügbar (da es durch Funktionsargumente überschrieben wird). Ich habe versuchtfoovar="$@"
undfoovar=$@
+"$foovar"
in der Funktion und keiner hat funktioniert: - /Sie möchten "$ @" (in US-Dollar angegeben) verwenden, um Parameter an einen Index zu übergeben. Wie so ....
ls-color.sh:
Warum .....
Von der Bash-Manpage :
Einrichten einiger Demoskripte ...
"$@"
- Quoted-Dollar- At ist eine Identitätstransformation zum erneuten Übergeben von Argumenten an eine Subshell (~ 99% der Zeit war dies das, was Sie vorhatten):"$*"
- Der zitierte Dollar-Stern zerschmettert die Argumente in eine einzelne Zeichenfolge (~ 1% der Zeit, in der Sie dieses Verhalten tatsächlich möchten, z. B. unter bestimmten Bedingungen :)if [[ -z "$*" ]]; then ...
:$*
/$@
- Ohne Anführungszeichen entfernen beide Formulare eine Anführungszeichen-Ebene und interpretieren Leerzeichen aus den zugrunde liegenden Zeichenfolgen, ignorieren jedoch Anführungszeichen (fast immer ist dies ein Fehler):Wenn Sie Spaß haben möchten, können Sie "$ @" verwenden, um Dinge so tief zu verschachteln, wie Sie möchten, und Elemente vom Args-Stapel zu entfernen, wenn Sie möchten.
quelle