IFS
não está diretamente relacionado ao loop, está relacionado à divisão de palavras. IFS
indiretamente determina como a saída do comando é dividida em partes que o loop itera.
Quando você tem uma substituição de variável desprotegida $foo
ou substituição de comando $(foo)
, existem dois casos:
- Se o contexto espera uma única palavra, por ex. quando a substituição estiver entre aspas duplas
"$foo"
ou em uma atribuição de variável x=$foo
, a sequência resultante da substituição será usada como é.
- Se o contexto espera várias palavras, o que é o caso na maioria das vezes, duas expansões adicionais são executadas na cadeia resultante:
- A string dividida em palavras . Qualquer caractere exibido em
$IFS
é considerado um separador de palavras. Por exemplo, IFS=":"; foo="12:34::78"; echo $foo
imprime 12 34 78
(com dois espaços entre 34
e 78
, pois há uma palavra vazia).
- Cada palavra é tratada como um padrão glob e expandida em uma lista de nomes de arquivos . Por exemplo,
foo="*"; echo $foo
imprime a lista de arquivos no diretório atual.
Para loops, como muitos outros contextos, espere uma lista de palavras. Então
for x in $(foo); do …
divide $(foo)
em palavras e trata cada palavra como um padrão glob. O valor padrão de IFS
é espaço, guia e nova linha , portanto, se foo
imprime duas linhas hello world
e howdy
, em seguida, o corpo do loop é executado com x=hello
e, em seguida, x=world
e x=howdy
. Se IFS
for explicitamente alterado para conter apenas uma nova linha, o loop será executado para hello world
e howdy
. Se IFS
for alterado para o
, o loop será executado para hell
, w
, rldh
(onde 
é um caractere de nova linha) e wdy
.