Anwendungen
Portal
Forum
Wiki
Ikhaya
Planet
Mehr
Private Nachrichten
Abonnements
Abmelden

erklärung zu einer Bash Zeile

Hallo

1
2
IN="bla@some.com;john@home.com"
arrIN=(${IN//;/ })

Mir geht es um die zweite zeile, wodurch wird der string veranlast sich zu teilen? Das Beispiel hab ich von http://stackoverflow.com

Zinoba schrieb:

1
2
IN="bla@some.com;john@home.com"
arrIN=(${IN//;/ })

Mir geht es um die zweite zeile, wodurch wird der string veranlast sich zu teilen?

Die Ersetzung macht aus dem ";" ein " " und danach setzt Word-Splitting ein. Also bekommt man zwei Einträge im Array.

Ciao

robert

Servus,

passiert in mehreren Schritten. Der erste ist die Ersetzung:

1
2
3
$ IN="bla@some.com;john@home.com"
$ echo ${IN//;/ }
bla@some.com john@home.com

Da wirst du sehen siehst du, dass das Semikolon durch ein Leerzeichen ersetzt wurde. Das ist eine Form der Parameter Expansion. Die normale Form ist „${foo/a/b}“, was das erste „a“ durch ein „b“ ersetzt. Die zwei Slashes bedeuten, dass alle Semikola durch Leerzeichen ersetzt werden sollen.

Nach dieser Ersetzung ist die Situation so, dass die Variable nicht in Anführungszeichen steht. Dadurch passiert Word Splitting an den Leerzeichen im String. Das heißt, es entstehen eigentlich zwei Strings: Einer enthält „bla@some.com“, der andere „john@home.com“.

Du könntest zu diesem Zeitpunkt bereits über diese beiden Strings iterieren:

1
2
3
4
$ IN="bla@some.com;john@home.com"
$ for i in ${IN//;/ }; do echo $i; done
bla@some.com
john@home.com

Stattdessen macht dein Code aber eine Array-Zuweisung, was an den beiden runden Klammern erkennbar ist. Da es sich um zwei Strings handelt, werden dem Array also zwei Elemente zugewiesen. Über die kann man auch zur Illustration mal iterieren:

1
2
3
4
5
$ IN="bla@some.com;john@home.com"
$ arrIN=(${IN//;/ })
$ for i in "${arrIN[@]}"; do echo $i; done
bla@some.com
john@home.com

Dasselbe Ergebnis, wie du siehst.

Nochmal: Wichtig zur tatsächlichen Auftrennung ist das Fehlen von Anführungszeichen in der Array-Zuweisung. Vergleiche deinen Code mal hiermit:

1
2
3
4
$ IN="bla@some.com;john@home.com"
$ arrIN=("${IN//;/ }")
$ for i in "${arrIN[@]}"; do echo $i; done
bla@some.com john@home.com

In diesem Fall gibt es kein Word Splitting, also enthält das Array nur ein Element.

Danke Vain & rklm.

Die auführlichkeit von Vains beitrag hat mir seh gut gefallen.