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 .