echo 命令换行,用于循环

echo 命令换行,用于循环

在我的文件“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
  • 更好的办法是:使用专门的工具来完成你的任务,比如grepsedawk

请阅读为什么使用 shell 循环来处理文本被认为是不好的做法?

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

相关内容