Gil*_*il' 29
IFS与循环没有直接关系,它与分词有关。IFS间接确定命令的输出如何分解为循环迭代的部分。
当您有不受保护的变量替换$foo或命令替换时$(foo),有两种情况:
"$foo"或在变量赋值中时x=$foo,则替换产生的字符串按原样使用。$IFS被视为单词分隔符。例如IFS=":"; foo="12:34::78"; echo $foo打印12 34 ? 78(带之间有两个空格34和78,因为有一个空字)。foo="*"; echo $foo打印当前目录中的文件列表。For 循环,像许多其他上下文一样,需要一个单词列表。所以
for x in $(foo); do …
Run Code Online (Sandbox Code Playgroud)
分解$(foo)成单词,并将每个单词视为一个全局模式。的默认值IFS是空格、制表符和换行符,因此如果foo打印出两行hello world,howdy然后使用x=hello, thenx=world和执行循环体x=howdy。如果IFS显式更改为仅包含换行符,则为hello worldand执行循环howdy。如果IFS更改为o,则为hell, ? w, rld??h(其中??是换行符)和执行循环wdy。
pbm*_*pbm 22
IFS代表- 它是一个分隔字段的字符。在您发布的示例中,它设置为换行符 ( );所以在你设置之后,将逐行处理文本。在该示例中,您可以更改(更改为输入文件中的某个字母)的值并检查文本将如何拆分。InputInternal Field Separator\nforIFS
顺便说一句,从您发布的第二个解决方案的答案来看,建议...
正如@jasonwryan 所注意到的,它不是Input但是Internal。名字Input来自awk其中还有OFS- Output Field Separator。
从 man bash
IFS 内部字段分隔符,用于在扩展后进行分词,并使用 read 内置命令将行拆分为单词。默认值为“<space><tab><newline>”。
这是 Bash 的内部变量之一。它决定了 Bash 在解释字符串时如何识别字段或单词边界。
虽然它默认为空格(空格、制表符和换行符),但可以更改它,例如,解析逗号分隔的数据文件。
http://tldp.org/LDP/abs/html/internalvariables.html
| 归档时间: |
|
| 查看次数: |
67322 次 |
| 最近记录: |