\bchar als Suffix von newline \nwird hinzugefügt, da das Ende \nder Befehlssubstitution entfernt wurde, $(...)sodass das \bals Suffix für verwendet wird \nund dadurch \nnicht mehr nachgestellt wird, sodass es von der Befehlssubstitution zurückgegeben wird.
Der Nebeneffekt, der darin besteht, dass IFSneben diesem auch ein \bZeichen und ein Trennzeichen vorhanden sind \n, ist das alleinige Interesse.
Wenn Sie erwarten, dass \beines Tages in der Zeichenfolge etwas passiert (warum nicht?), Können Sie Folgendes verwenden:
IFS="$(printf '\nx')" && IFS="${IFS%x}";
Das returns \n suffixed with x && removes x
Jetzt hat IFS nur noch das \nZeichen.
IFS="$(printf '\nx')" && IFS="${IFS%x}";
echo ${#IFS};
und nichts wird im Falle von \bTest brechen :
#!/bin/sh
sentence=$(printf "Foo\nBar\tBaz Maz\bTaz");
IFS="$(printf '\nx')" && IFS="${IFS%x}";
for entry in $sentence
do
printf "Entry: ${entry}.\n";
done
gibt zwei Zeilen (wegen einer \n):
Entry: Foo.
Entry: Bar Baz Maz Taz.
wie erwartet.
anstatt zu IFS="$(printf '\nx')" && IFS="${IFS%x}";verwenden:
IFS="
"
gibt das gleiche Ergebnis, aber diese beiden Zeilen dürfen nicht eingerückt werden. Wenn Sie versehentlich Leerzeichen oder Tabulatoren oder andere weiße Zeichen zwischen "und" setzen, haben Sie dort nicht mehr nur \nZeichen, sondern auch einige "Boni". Das ist schwer zu tun Stelle, es sei denn, Sie verwenden die Option Alle Zeichen in Ihrem Editor anzeigen.