期待了解 读取 IFS 变量时的行为 p>
$ cat f1
a:b:c
d:e:f
$ while IFS= read -d: ; do echo $REPLY; done < f1
a
b
c d
e
$ while IFS=: read; do echo $REPLY; done < f1
a:b:c
d:e:f
答案 0 :(得分:4)
IFS
阅读多个变量时,会使用 read
:
$ echo foo:bar:baz | (IFS=: read FOO BAR BAZ; echo $FOO; echo $BAR; echo $BAZ)
foo
bar
baz
然而,-d
选项指定read
的行分隔符是什么; read
不会超越一行:
$ echo foo:bar:baz%baz:qux:quux% | while IFS=: read -d% FOO BAR BAZ; do echo ---; echo $FOO; echo $BAR; echo $BAZ; done
---
foo
bar
baz
---
baz
qux
quux
答案 1 :(得分:0)
IFS是场间分隔符。 你说shell用哪些符号来分割字段。 它用于两个方向,不仅仅是在阅读时。
您在此处使用的一个特例是IFS=
。您可以在此处使用IFS=
来正确处理以空格开头的输入。
您可以比较:
echo " a" | IFS= read a
echo " a" | read a
在处理文件时这很重要,它们的名称中可以包含前导空格。
请比较:
$ echo " a" | ( IFS= read a; echo .$a. )
. a.
$ echo " a" | ( read a; echo .$a. )
.a.
更新。正如您可能已经注意到的那样, 这种结构
$ echo a | read a
不起作用。因为shell为'''读'''创建了一个子shell,你只能在里面看到$a
的值。
您还可以使用while
,更常见的是:
$ echo a | while read a; do echo $a; done