www.mikrocontroller.net

Forum: PC-Programmierung Shell: String splitten


Autor: Informant (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie geht das?

string="ich bin ein string"

???

echo $eins # -> ich
echo $zwei # -> bin

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, geht bestimmt auch einfacher, aber momentan bin ich etwas
phantasielos. Da fällt mir nur ein:
klaus@i4a:/tmp > s="abc def"; i=0; for w in $s; do a[$i]=$w; i=$(( i + 1 ));  done; echo erster ist ${a[0]}; echo zweiter ist ${a[1]}
erster ist abc
zweiter ist def

Autor: Thomas Pircher (tpircher) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
string="ich bin ein string"
set -- $string
echo $1
echo $2
echo $3

HTH
Thomas

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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):
string="ich bin ein string"

a=($string)
eins=${a[0]}
zwei=${a[0]}

echo $eins # -> ich
echo $zwei # -> bin

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder:
s="abc def"; ( echo $s | read a b ); echo erster ist $a; echo zweiter ist  $b

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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
( echo $s | read a b dummy );

oder einfach
read a b dummy <<< "$s"

schreiben.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.
read eins zwei rest <<EOF
$(echo $s)
EOF
echo $zwei

sollte aber mit allen gängigen Shells klappen.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
$ s="abc def"; ( echo $s | read a b ); echo erster ist $a; echo zweiter ist  $b
erster ist
zweiter ist

$ echo $SHELL
/bin/bash
$ echo $BASH_VERSION
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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.