IFS
significa "separador de campo interno". É usado pelo shell para determinar como fazer a divisão de palavras, ou seja, como reconhecer os limites das palavras.
Tente isso em um shell como o bash (outros shells podem lidar com isso de maneira diferente, por exemplo, zsh):
mystring="foo:bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
O valor padrão para IFS
consiste em caracteres de espaço em branco (para ser mais preciso: espaço, tabulação e nova linha). Cada caractere pode ser um limite de palavra. Portanto, com o valor padrão de IFS
, o loop acima será impresso:
Word: foo:bar
Word: baz
Word: rab
Em outras palavras, o shell pensa que espaço em branco é um limite de palavra.
Agora, tente configurar IFS=:
antes de executar o loop. Desta vez, o resultado é:
Word: foo
Word: bar baz rab
Agora, o shell se divide mystring
em palavras também - mas agora, trata apenas dois pontos como o limite da palavra.
O primeiro caractere de IFS
é especial: é usado para delimitar palavras na saída ao usar a $*
variável especial (exemplo extraído do Advanced Bash Scripting Guide , onde você também pode encontrar mais informações sobre variáveis especiais como essa):
$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z
Comparado a:
$ bash -c 'set w x y z; IFS="-:;"; echo "$*"'
w-x-y-z
Note-se que em ambos os exemplos, o shell ainda irá tratar todos os personagens :
, -
e ;
como limites de palavra. A única coisa que muda é o comportamento de $*
.
Outra coisa importante a saber é como o chamado "espaço em branco do IFS" é tratado . Basicamente, assim que IFS
inclui caracteres de espaço em branco, os espaços em branco à esquerda e à direita são removidos da sequência a ser dividida antes de processá-la e uma sequência de caracteres consecutivos em branco também delimita os campos. No entanto, isso se aplica apenas aos caracteres de espaço em branco que estão realmente presentes no IFS
.
Por exemplo, vejamos a sequência "a:b:: c d "
(espaço à direita e dois caracteres de espaço entre c
e d
).
- Com
IFS=:
isso seria dividido em quatro campos: "a"
, "b"
, ""
(string vazia) e " c d "
(novamente, dois espaços entre c
e d
). Observe o espaço em branco à esquerda e à direita no último campo.
- Com
IFS=' :'
, que seria dividido em cinco campos: "a"
, "b"
, ""
(string vazia), "c"
e "d"
. Nenhum espaço em branco à esquerda e à esquerda em qualquer lugar.
Observe como vários caracteres de espaço em branco consecutivos delimitam dois campos no segundo exemplo, enquanto vários dois pontos consecutivos não o fazem (já que não são caracteres de espaço em branco).
Quanto a IFS=$'\n'
, que é uma ksh93
sintaxe também suportado por bash
, zsh
, mksh
e FreeBSD sh
(com variações entre todas as conchas). Citando a página de manual do bash:
Palavras da forma $ 'string' são tratadas especialmente. A palavra se expande para "string", com caracteres de escape com barra invertida substituídos conforme especificado pelo padrão ANSI C.
\n
é a sequência de escape de uma nova linha e, portanto, IFS
acaba sendo definida como um único caractere de nova linha.