什么是“IFS”变量?

什么是“IFS”变量?

我正在读这个问答:如何循环遍历文件的行?

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

答案1

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

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

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

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

for x in $(foo); do …

分解$(foo)为单词,并将每个单词视为一个全局模式。IFS的默认值为空格、制表符和换行符,因此 iffoo打印出两行hello world,然后使用、then和howdy执行循环体。如果显式更改为仅包含换行符,则针对和执行循环。如果更改为,则对, , (其中是换行符)和执行循环。x=hellox=worldx=howdyIFShello worldhowdyIFSohell​ wrld​␤h​␤wdy

答案2

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

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

作为@jasonwryan注意到了,不是Input但是Internal。名字Input的由来,awk其中还有OFS- Output Field Separator

答案3

man bash

IFS 内部字段分隔符,用于扩展后的字拆分以及使用 read 内置命令将行拆分为字。默认值为“<空格><制表符><换行>”。

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

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

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

答案4

除了之前的精彩答案之外,我还要补充一点IFS与简单情况结合使用,对于高效且可移植的解析非常有用。高效,因为避免使用子 shell 和生成工具(如 grep 或 sed):

resolutions="640x480,320x240"
xIFS=$IFS
IFS=','
for res in $resolutions; do
    xxIFS=$IFS
    IFS='x'
    set -- $res
    width=$1
    height=$2
    # handle width and height
    IFS=$xxIFS
done;
IFS=$xIFS

请注意,我们需要存储并恢复以前的值IFS以避免脚本其他部分出现意外损坏。

相关内容