我正在阅读此线程:如何循环遍历文件行?
什么IFS
啊 在for
-loops 上下文中它的用法是什么?
我正在阅读此线程:如何循环遍历文件行?
什么IFS
啊 在for
-loops 上下文中它的用法是什么?
Answers:
IFS
代表-它是分隔字段的字符。在您发布的示例中,将其设置为换行符();因此设置后,将逐行处理文本。在该示例中,您可以将(更改为输入文件中的某个字母)的值,并检查如何拆分文本。Input
Internal Field Separator
\n
for
IFS
顺便说一句,从您发布的答案的第二个解决方案是建议...
正如@jasonwryan注意到的,不是,Input
而是Internal
。名称Input
来自awk
其中还有OFS
- Output Field Separator
。
S
是用于Bourne外壳中的分隔符的,而它是它的起源。在Korn外壳以及现在已由指定的大多数其他Bourne-like外壳中,Delimiter POSIX
的S
is(只是有点想像力)A::B:
例如被分为“ A”,“”和“ B”(没有多余的内容) “”)。不同于awk
的FS
或的s
参数扩展标志zsh
。
IFS
与循环不直接相关,与单词拆分有关。IFS
间接确定命令的输出如何分解成循环迭代的部分。
当您进行无保护的变量替换$foo
或命令替换时$(foo)
,有两种情况:
"$foo"
或在变量赋值中x=$foo
,则替换产生的字符串将按原样使用。像许多其他上下文一样,对于循环,需要单词列表。所以
for x in $(foo); do …
分解$(foo)
为单词,并将每个单词视为全局模式。的默认值IFS
是空格,制表符和换行,因此,如果foo
打印出两条线hello world
和howdy
然后循环体与执行x=hello
,然后x=world
和x=howdy
。如果IFS
显式更改为仅包含换行符,则对hello world
和执行循环howdy
。如果IFS
被改变为o
正,则循环用于执行hell
, w
,rldh
(其中,
是一个新行字符)和wdy
。
"IFS indirectly determines how ..."
?
IFS
(直接)确定如何分解命令替换的输出,然后(间接)确定循环循环的内容。
从 man bash
IFS内部字段分隔符,用于在扩展后进行单词拆分,并使用read Builtin命令将行拆分为单词。默认值为“ <space> <tab> <newline>”。
这是Bash的内部变量之一。它确定Bash在解释字符串时如何识别字段或单词边界。
虽然它默认为空格(空格,制表符和换行符),但是可以更改它,例如解析逗号分隔的数据文件。
除了以前的出色答案之外,我还想补充一点,IFS对于在简单情况下与set结合使用对于高效且可移植的解析非常有用。高效,因为避免使用子外壳和生成工具(例如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的先前值,以避免脚本其他部分发生意外损坏。