在我的文件“foo”中,第一行是“a b”,第二行是“c d”:
$ cat foo
a b
c d
我想在终端循环打印这两行:一个接一个:
$ for i in $(cat foo); do echo $i; done
但是在输出中“echo”命令会破坏顺序,因此不应这样:
a b
c d
我实际上有:
a
b
c
d
答案1
for i in $(cat foo)
不循环行,但循环按你的字段分隔符$IFS
。其默认为\n\t
(空格、换行符、制表符)。
如果将字段分隔符更改为换行符,则可以按原样使用命令(免责声明:请阅读下文!):
IFS=$'\n'
for i in $(cat foo); do echo $i; done
您可能需要备份 IFS 以便稍后恢复它:
OLD_IFS="$IFS"
.
.
.
IFS="$OLD_IFS"
输出:
a b
c d
然而,这被认为是坏的实践。
- 好一点:
while IFS= read -r line; do ... done < file
- 更好的办法是:使用专门的工具来完成你的任务,比如
grep
、sed
或awk
。
答案2
您可以while read
为此目的使用
[/tmp]$ while read line ; do echo $line ; done < foo
a b
c d
添加分隔符以便于您理解
[/tmp]$ while read line ; do echo $line ; echo "----" ; done < foo
a b
----
c d
----
[/tmp]$