带有选项-d和IFS变量组合的Unix读命令

时间:2014-02-10 13:56:30

标签: shell unix

期待了解 读取 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

2 个答案:

答案 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