IFSoznacza „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 IFSskł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 IFSpowyż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ż mystringna słowa - ale teraz traktuje tylko dwukropek jako granicę słów.
Pierwszy znak IFSjest 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 IFSznaki 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 ci d).
- Z
IFS=:byłoby podzielić na cztery pola: "a", "b", ""(pusty ciąg znaków) i " c d "(ponownie, dwie przestrzenie pomiędzy ca 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 ksh93składnia również obsługiwane przez bash, zsh, mkshi 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.
\njest sekwencją zmiany znaczenia dla nowej linii, więc IFSkończy się na pojedynczym znaku nowej linii.