使用带循环和标准输出重定向的bash -c

时间:2010-11-14 05:45:53

标签: bash

为什么以下命令的标准输出会有所不同?

命令1:

for ((i=0; i<10; i=i+1)); do echo $i; done

命令2:

bash -c "for ((i=0; i<10; i=i+1)); do echo $i; done"

command1按预期在单独的行上打印整数1到10。 command2在每一行打印10个。

我需要做什么才能让command2打印与command1相同的东西?

长篇故事:

我经常需要在大量文件上运行可执行文件并捕获整个进程的输出。我在名为my_script.sh的单独文件中使用类似于command1的for循环。

然后我可以使用:

获取输出
bash my_script.sh > results.txt

因为为简单的for循环创建一个单独的my_script.sh文件有点痛苦,我希望通过使用“bash -c”来实现同样的目的,但遇到了这个问题。

感谢您的任何建议。期待回复。
米莎

1 个答案:

答案 0 :(得分:10)

  

我需要做什么才能让command2打印与command1相同的东西?

你需要修改这一行:

bash -c "for ((i=0; i<10; i=i+1)); do echo $i; done"

这样说:

bash -c "for ((i=0; i<10; i=i+1)); do echo \$i; done"

正在发生的是$i序列正由您正在运行bash的shell解释,它在传递之前将自己的 i变量替换为字符串它将关闭到要执行的新bash实例。所以当新的bash看到字符串时,它是:

for ((i=0; i<10; i=i+1)); do echo 10; done

假设i包含值“10”。

(当我第一次运行第二个脚本时,我在运行第一个脚本之前,它写出了10个空白行,因为我没有定义i变量,所以它在空字符串中替换。)