IFS
oznacza „wewnętrzny separator pól”. Jest on używany przez powłokę do określania sposobu dzielenia słów, tj. Rozpoznawania granic słów.
Wypróbuj to w powłoce, takiej jak bash (inne powłoki mogą obsługiwać to inaczej, na przykład zsh):
mystring="foo:bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
Wartość domyślna dla IFS
składa się ze spacji (a dokładniej: spacji, tabulacji i nowego wiersza). Każdy znak może być granicą wyrazu. Zatem przy domyślnej wartości IFS
powyższa pętla wyświetli:
Word: foo:bar
Word: baz
Word: rab
Innymi słowy, powłoka uważa, że białe znaki to granica słów.
Teraz spróbuj ustawić IFS=:
przed wykonaniem pętli. Tym razem wynik jest następujący:
Word: foo
Word: bar baz rab
Teraz skorupa dzieli się również mystring
na słowa - ale teraz traktuje tylko dwukropek jako granicę słów.
Pierwszy znak IFS
jest specjalny: służy do rozgraniczenia słów na wyjściu, gdy używana jest $*
zmienna specjalna (przykład wzięty z Advanced Bash Scripting Guide , gdzie można również znaleźć więcej informacji na temat zmiennych specjalnych takich jak ta):
$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z
Porównać do:
$ bash -c 'set w x y z; IFS="-:;"; echo "$*"'
w-x-y-z
Należy zauważyć, że w obu przykładach, powłoka będzie nadal traktować wszystkich bohaterów :
, -
a ;
jak granice tekstu. Jedyne, co się zmienia, to zachowanie $*
.
Inną ważną rzeczą, o której należy wiedzieć, jest sposób traktowania tak zwanych „białych znaków IFS” . Zasadniczo, gdy tylko IFS
znaki białych znaków zostaną wstawione, początkowe i końcowe białe znaki są usuwane z ciągu znaków do podziału przed przetworzeniem, a sekwencja kolejnych znaków białych również ogranicza pola. Dotyczy to jednak tylko tych białych znaków, które są w rzeczywistości obecne IFS
.
Na przykład spójrzmy na ciąg znaków "a:b:: c d "
(spacja końcowa i dwa znaki spacji między c
i d
).
- Z
IFS=:
byłoby podzielić na cztery pola: "a"
, "b"
, ""
(pusty ciąg znaków) i " c d "
(ponownie, dwie przestrzenie pomiędzy c
a d
). Zwróć uwagę na wiodące i końcowe białe znaki w ostatnim polu.
- Dzięki
IFS=' :'
, że będzie podzielony na pięć obszarów: "a"
, "b"
, ""
(pusty ciąg znaków), "c"
a "d"
. Nigdzie nie ma wiodących i końcowych białych znaków.
Zwróć uwagę, w jaki sposób wiele kolejnych białych znaków ogranicza dwa pola w drugim przykładzie, podczas gdy wiele kolejnych dwukropków nie (ponieważ nie są to białe znaki).
Jeśli chodzi o IFS=$'\n'
, to jest ksh93
składnia również obsługiwane przez bash
, zsh
, mksh
i FreeBSD sh
(z różnic między wszystkich powłok). Cytując stronę podręcznika bash:
Słowa w postaci $ „string” są traktowane specjalnie. Słowo rozwija się do „łańcucha”, z zastąpionymi odwrotnymi znakami znakami, jak określono w standardzie ANSI C.
\n
jest sekwencją zmiany znaczenia dla nowej linii, więc IFS
kończy się na pojedynczym znaku nowej linii.