Gast
#1430158
wie geht das? string="ich bin ein string" ??? echo $eins # -> ich echo $zwei # -> bin
|
Anzeige
|
Shell: String splitten
Gast
#1430158
wie geht das? string="ich bin ein string" ??? echo $eins # -> ich echo $zwei # -> bin hm, geht bestimmt auch einfacher, aber momentan bin ich etwas phantasielos. Da fällt mir nur ein:
HTH Thomas
Gast
#1430209
Wenn man die Aufrufargumente ($1, $2 usw.) nicht überschreiben möchte, geht auch eine vereinfachte Version von Klaus' Array-Lösung (zumindest in der Bash):
oder:
Gast
#1430454
> s="abc def"; ( echo $s | read a b ); echo erster ist $a; echo zweiter ist $b
Damit auch Strings mit mehr als zwei Wörtern (wie im Beispiel von
Informant) richtig gesplittet werden, sollte man besser
oder einfach
schreiben. Du solltest spezifizieren, welche Shell Du meinst. >> s="abc def"; ( echo $s | read a b ); echo erster ist $a; echo zweiter ist $b ist bei einer standardkonformen (POSIX/SUSv4) Shell nichts, da der read selbst ohne die (unnötigen) Klammern in einer Subshell läuft und die nichts nach oben geben kann. > read a b dummy <<< "$s" Ein '<<<' kennt der Standard ebenfalls nicht. Mit Bash z.B. werden beide Beispiele nicht funktionieren.
sollte aber mit allen gängigen Shells klappen.
Gast
#1430556
Hazeh Zimmerer schrieb: >>> s="abc def"; ( echo $s | read a b ); echo erster ist $a; echo zweiter ist $b > > ist bei einer standardkonformen (POSIX/SUSv4) Shell nichts, da der read > selbst ohne die (unnötigen) Klammern in einer Subshell läuft und die > nichts nach oben geben kann. Stimmt. >> read a b dummy <<< "$s" > > Ein '<<<' kennt der Standard ebenfalls nicht. Ich kenne den POSIX-Standard nicht auswendig, aber die Bash mit der Option --posix akzeptiert das '<<<' jedenfalls. > Mit Bash z.B. werden beide Beispiele nicht funktionieren. Die '<<<'-Variante mit der Bash 4.0.28(2)¹ schon :) ¹) wahrscheinlich auch mit deutlich älteren Versionen, die Here-Strings gibt es in der Bash schon sehr lange meine Variante funktioniert ebenfalls mit der bash, ich hatte es vorher getestet und jetzt zur Sicherheit nochmals. Gem. POSIX und mit der sh in der Tat nicht.
Mit Version 4.0.0(3)-release dasselbe. Es kann nicht gehen, da ein Kind (die Subshell = die Befehle in Klammern) nicht die Variablen seines Elternprozesses ändern kann. Die Variablen der Subshell sind lokal, nach der schließenden Klammer sind die Variablen der Subshell wieder weg. Ohne Klammern (sie sind überflüssig) würde es vermutlich in der zsh gehen, in der Bash immer noch nicht, da die Pipe selbst in einer Subshell ausgeführt wird. Wenn Du ein anderes (nicht leeres) Ergebnis bekommst, sind die Variablen "erster" und "zweiter" evtl. durch vorheriges Experimentieren in Deiner Hauptshell bereits gesetzt, ihr Inhalt kann nicht von der Subshell kommen. ups.... ich nehme alles zurück und behaupte das Gegenteil. Diese Version geht tatsächlich nicht! Ich hatte es zwar probiert, aber dummerweise in der selben Shell wie die vorhergehende (funktionierende) Version. Von der waren a und b noch gesetzt, wodurch das abschließende echo... etwas ausgab. Sorry und Danke für die hartnäckige Korrektur! Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|