什么是“IFS”?

chr*_*lee 28 shell bash

我正在阅读这个线程:如何遍历文件的行?

什么是IFS?它在for-loops上下文中的用法是什么?

Gil*_*il' 29

IFS与循环没有直接关系,它与分词有关。IFS间接确定命令的输出如何分解为循环迭代的部分。

当您有不受保护的变量替换$foo或命令替换时$(foo),有两种情况:

  • 如果上下文需要单个单词,例如当替换在双引号之间"$foo"或在变量赋值中时x=$foo,则替换产生的字符串按原样使用。
  • 如果上下文需要多个单词(大多数情况下都是这种情况),则对结果字符串执行两个进一步的扩展:
    • 该字符串被拆分为 words。中出现的任何字符都$IFS被视为单词分隔符。例如IFS=":"; foo="12:34::78"; echo $foo打印12 34 ? 78(带之间有两个空格3478,因为有一个空字)。
    • 每个单词都被视为一个 glob 模式并扩展为一个文件名列表。例如,foo="*"; echo $foo打印当前目录中的文件列表。

For 循环,像许多其他上下文一样,需要一个单词列表。所以

for x in $(foo); do …
Run Code Online (Sandbox Code Playgroud)

分解$(foo)成单词,并将每个单词视为一个全局模式。的默认值IFS空格、制表符和换行符,因此如果foo打印出两行hello worldhowdy然后使用x=hello, thenx=world和执行循环体x=howdy。如果IFS显式更改为仅包含换行符,则为hello worldand执行循环howdy。如果IFS更改为o,则为hell, ? w, rld??h(其中??是换行符)和执行循环wdy


pbm*_*pbm 22

IFS代表- 它是一个分隔字段的字符。在您发布的示例中,它设置为换行符 ( );所以在你设置之后,将逐行处理文本。在该示例中,您可以更改(更改为输入文件中的某个字母)的值并检查文本将如何拆分。Input Internal Field Separator\nforIFS

顺便说一句,从您发布的第二个解决方案的答案来看,建议...

正如@jasonwryan 所注意到的,它不是Input但是Internal。名字Input来自awk其中还有OFS- Output Field Separator


jas*_*yan 6

man bash

IFS 内部字段分隔符,用于在扩展后进行分词,并使用 read 内置命令将行拆分为单词。默认值为“<space><tab><newline>”。

这是 Bash 的内部变量之一。它决定了 Bash 在解释字符串时如何识别字段或单词边界。

虽然它默认为空格(空格、制表符和换行符),但可以更改它,例如,解析逗号分隔的数据文件。

http://tldp.org/LDP/abs/html/internalvariables.html