IFSsignifica "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 IFSconsiste 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 mystringem 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 IFSinclui 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 ce d).
- Com
IFS=:isso seria dividido em quatro campos: "a", "b", ""(string vazia) e " c d "(novamente, dois espaços entre ce 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 ksh93sintaxe também suportado por bash, zsh, mkshe 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, IFSacaba sendo definida como um único caractere de nova linha.