我正在读这个问答:如何循环遍历文件的行?
变量是什么IFS
?它在 -loops 的上下文中的用法是什么for
?
答案1
IFS
与循环没有直接关系,它与分词有关。IFS
间接确定命令的输出如何分解为循环迭代的片段。
当你有不受保护的变量替换$foo
或命令替换时$(foo)
,有两种情况:
- 如果上下文需要单个单词,例如当替换在双引号之间
"$foo"
或在变量赋值中时x=$foo
,则按原样使用替换产生的字符串。 - 如果上下文需要多个单词(大多数情况下都是这种情况),则对结果字符串执行两次进一步的扩展:
与许多其他上下文一样,for 循环需要一个单词列表。所以
for x in $(foo); do …
分解$(foo)
为单词,并将每个单词视为一个全局模式。IFS
的默认值为空格、制表符和换行符,因此 iffoo
打印出两行hello world
,然后使用、then和howdy
执行循环体。如果显式更改为仅包含换行符,则针对和执行循环。如果更改为,则对, , (其中是换行符)和执行循环。x=hello
x=world
x=howdy
IFS
hello world
howdy
IFS
o
hell
w
rldh

wdy
答案2
IFS
代表- 它是分隔字段的字符。在您发布的示例中,它被设置为换行符();所以设置后,将逐行处理文本。在该示例中,您可以更改 的值(更改为输入文件中的某个字母)并检查文本的分割方式。Input
Internal Field Separator
\n
for
IFS
顺便说一句,从您发布的答案来看,第二个解决方案是推荐的解决方案......
作为@jasonwryan注意到了,不是Input
但是Internal
。名字Input
的由来,awk
其中还有OFS
- Output Field Separator
。
答案3
从man bash
IFS 内部字段分隔符,用于扩展后的字拆分以及使用 read 内置命令将行拆分为字。默认值为“<空格><制表符><换行>”。
这是 Bash 的内部变量之一。它决定了 Bash 在解释字符串时如何识别字段或单词边界。
虽然它默认为空白(空格、制表符和换行符),但它可以更改,例如,解析以逗号分隔的数据文件。
答案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以避免脚本其他部分出现意外损坏。