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
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
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.