Ich schreibe ein Bash-Skript, in dem ich eine Zeichenfolge mit Leerzeichen an eine Funktion in meinem Bash-Skript übergeben muss.
Beispielsweise:
#!/bin/bash
myFunction
{
echo $1
echo $2
echo $3
}
myFunction "firstString" "second string with spaces" "thirdString"
Beim Ausführen würde ich folgende Ausgabe erwarten:
firstString
second string with spaces
thirdString
Was jedoch tatsächlich ausgegeben wird, ist:
firstString
second
string
Gibt es eine Möglichkeit, eine Zeichenfolge mit Leerzeichen als einzelnes Argument an eine Funktion in bash zu übergeben?
echo "$@"
oderfor i in "$@"; do echo $i ; done
verwenden Sie korrekt zitierte Parameter, die Leerzeichen enthalten. Dies ist die in allenbash
Dokumentationen unterpositional parameters
Abschnitt sehr deutlich erwähnte .myFunction "$@"
Antworten:
Sie sollten Anführungszeichen setzen und außerdem ist Ihre Funktionsdeklaration falsch.
Und wie die anderen funktioniert es auch bei mir. Sagen Sie uns, welche Version der Shell Sie verwenden.
quelle
$@
verhält sich ohne Anführungszeichen wie ohne Anführungszeichen. Die$*
Ergebnisse werden in Zeichenfolgen aufgeteilt und dann einzeln global erweitert. Wenn Sie also Registerkarten haben, werden diese in Leerzeichen konvertiert, wenn Sie Wörter haben, die als globale Ausdrücke ausgewertet werden können wird sein, etc.Eine andere Lösung für das obige Problem besteht darin, jede Zeichenfolge auf eine Variable zu setzen und die Funktion mit Variablen aufzurufen, die durch ein Literal-Dollarzeichen gekennzeichnet sind
\$
. Verwenden Sie dann in der Funktioneval
, um die Variable zu lesen und wie erwartet auszugeben.Die Ausgabe ist dann:
Bei dem Versuch, ein ähnliches Problem zu lösen, stieß ich auf das Problem von UNIX, weil ich dachte, meine Variablen seien durch Leerzeichen getrennt. Ich habe versucht, eine durch Pipe getrennte Zeichenfolge mit an eine Funktion zu übergeben
awk
zu übergeben, um eine Reihe von Variablen festzulegen, die später zum Erstellen eines Berichts verwendet wurden. Ich habe zunächst die von Ghostdog74 veröffentlichte Lösung ausprobiert, konnte sie jedoch nicht zum Laufen bringen, da nicht alle meine Parameter in Anführungszeichen übergeben wurden. Nachdem jedem Parameter doppelte Anführungszeichen hinzugefügt wurden, begann er wie erwartet zu funktionieren.Unten ist der Vor-Status meines Codes und der voll funktionsfähige Nach-Status.
Vorher - Nicht funktionierender Code
Nach - Funktionscode
quelle
Die einfachste Lösung für dieses Problem besteht darin, dass Sie
\"
beim Ausführen eines Shell-Skripts nur für durch Leerzeichen getrennte Argumente verwenden müssen:quelle
Ihre Definition von myFunction ist falsch. Es sollte sein:
oder:
Wie auch immer, es sieht gut aus und funktioniert gut für mich unter Bash 3.2.48.
quelle
Ich bin 9 Jahre zu spät, aber ein dynamischerer Weg wäre
quelle
Einfache Lösung, die für mich funktioniert hat - zitiert $ @
Ich konnte den tatsächlichen grep-Befehl überprüfen (dank set -x).
quelle
Sie könnten eine Erweiterung dieses Problems haben, wenn Ihr ursprünglicher Text in eine Variable vom Typ Zeichenfolge gesetzt wurde, zum Beispiel:
In diesem Fall wird die Variable status_message, wenn Sie sie nicht als Zeichenfolge (umgeben von "") weiterleiten, in eine Reihe verschiedener Argumente aufgeteilt.
"$ variable" : Der aktuelle Titel ist CDE bei DEF von ABC
$ variable : Die
quelle
myFunction "firstString" "second string with spaces" "thirdString"
und es hat bei ihm nicht funktioniert. Was Sie vorschlagen, gilt also nicht für diese Frage.Hatte die gleiche Art von Problem und tatsächlich war das Problem nicht die Funktion oder der Funktionsaufruf, sondern das, was ich als Argumente an die Funktion übergeben habe.
Die Funktion wurde aus dem Hauptteil des Skripts aufgerufen - dem 'main' -, also habe ich "st1 a b" "st2 c d" "st3 e f" von der Befehlszeile übergeben und sie mit myFunction $ * an die Funktion übergeben
Das $ * verursacht das Problem, da es sich zu einer Reihe von Zeichen erweitert, die beim Aufruf der Funktion unter Verwendung von Leerzeichen als Trennzeichen interpretiert werden.
Die Lösung bestand darin, den Aufruf der Funktion in der expliziten Argumentbehandlung von 'main' in Richtung der Funktion zu ändern: Der Aufruf wäre dann myFunction "$ 1" "$ 2" "$ 3", wodurch das Leerzeichen in Zeichenfolgen erhalten bleibt, da die Anführungszeichen begrenzt werden die Argumente ... Wenn ein Parameter also Leerzeichen enthalten kann, sollte er bei allen Funktionsaufrufen explizit behandelt werden.
Da dies der Grund für lange Suchen nach Problemen sein kann, ist es möglicherweise ratsam, niemals $ * zu verwenden, um Argumente zu übergeben ...
Hoffe, das hilft jemandem, eines Tages, irgendwo ... Jan.
quelle
"$@"
, nicht alle zitiert"$1"
,"$2"
... Positions paramters noch$*
.