“为每个”标准输出bash

时间:2016-07-29 15:26:31

标签: bash foreach

我希望生成一个包含以下命令结果的输出文件:

cd /path/to/files/; for each in *; do cat $each; echo "######_NEW_FILE_######"; done 

我试过了:

cd /path/to/files/; for each in *; do cat $each; echo "######_NEW_FILE_######"; > output.txt; done 

这会生成文件,但它是空白的。我也尝试过:

cd /path/to/files/; for each in *; do cat $each; echo "######_NEW_FILE_######"; done; >output.txt 

这会生成一个太大的文件。这不是我想要的。 谢谢您的帮助。

3 个答案:

答案 0 :(得分:3)

如果你想为一个命令块设置一个重定向,而没有子shell中涉及的性能影响和其他副作用,请将它放在大括号中:

{
  cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done 
} >output.txt

......作为一个单行,请务必在结束括号前加;

{ cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done; } >output.txt

顺便说一句,请注意它是cat "$each",而不是cat $each。如果您使用touch '*'创建了一个文件,那么您的输出大小就会翻倍。

那就是说,这确实非常接近与:

相同
cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done >output.txt

... >output.txt适用于for循环(仅适用于循环)。不一样的是,{ ... }方法还重定向来自cd命令的任何stdout(除非你用shell函数包装器或类似物重新定义,否则应该没有)。

也就是说:

# this does not redirect the header
cd /path/to/files; echo "header"; for each in *; do cat "$each"; done >output

# this does not redirect the header or the loop
cd /path/to/files; echo "header"; for each in *; do cat "$each"; done; echo footer >output

# this redirects everything
{ cd /path/to/files; echo "header"; for each in *; do cat "$each"; done; echo footer; } >output

答案 1 :(得分:1)

此:

... echo $each"######_NEW_FILE_######"; > output.txt
                                      ^---

您使用echo终止;,使> output.txt语句完全独立于回声。

你想要

... echo '...' > output.txt; etc...
                           ^---note

答案 2 :(得分:0)

done后面的分号结束语句,这意味着重定向不与任何命令相关联。

丢失最后一个;,它应该有效。