Shell: String splitten

#1430510
Lesenswert?

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.
1
read eins zwei rest <<EOF
2
$(echo $s)
3
EOF
4
echo $zwei

sollte aber mit allen gängigen Shells klappen.
Gast #1430556
Lesenswert?

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
#1430732
Lesenswert?

1
$ s="abc def"; ( echo $s | read a b ); echo erster ist $a; echo zweiter ist  $b
2
erster ist
3
zweiter ist
4

5
$ echo $SHELL
6
/bin/bash
7
$ echo $BASH_VERSION
8
3.2.48(1)-release

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.
#1430934
Lesenswert?

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 schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren