Wenn ich die IFS
Variable auf ein Leerzeichen setze , werden bash
mehrere Leerzeichen als ein Leerzeichen behandelt ( myprogram
ein Programm, das die empfangenen Befehlszeilenargumente ausgibt):
IFS=" "
x="hello hi world"
./myprogram $x
argv[1] = hello
argv[2] = hi
argv[3] = world
Wenn ich die IFS
Variable jedoch auf ein Komma setze bash
, werden mehrere Kommas nicht als ein Komma behandelt:
IFS=","
x="hello,,,hi,,,world"
./myprogram $x
argv[1] = hello
argv[2] =
argv[3] =
argv[4] = hi
argv[5] =
argv[6] =
argv[7] = world
Warum das?
Antworten:
Dies ist dokumentiert in
man bash
. Ein einzelnes Vorkommen eines Zeichens in IFS, das kein Leerzeichen ist, begrenzt ein Feld.Von
man bash
:Beispiele: Feldaufteilung
Wenn IFS keine Leerzeichen enthält, werden die Felder mit Leerzeichen versehen:
Wenn IFS sowohl Leerzeichen als auch ein Komma enthält, werden Folgen von Leerzeichen, gefolgt von einem Komma, gefolgt von Folgen von Leerzeichen als ein einzelnes Trennzeichen behandelt:
Folgen von Kommas werden als Folgen von leeren Feldern interpretiert:
Beispiele: führende und nachfolgende Leerzeichen
Wenn IFS kein Leerzeichen enthält, werden alle führenden und nachfolgenden Leerzeichen in den Feldern beibehalten:
Wenn IFS Leerzeichen enthält, werden alle führenden oder nachfolgenden Folgen von Leerzeichen entfernt:
quelle
awk
mit der-F'\t'
Option odercut
. Wenn Sie über eine neuere Version von verfügenbash
, können Sie die Felder möglicherweise auch mithilfereadarray
der-d$'\t'
Option analysieren .