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

mpe*_*kov 1 bash

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

命令1:

for ((i=0; i<10; i=i+1)); do echo $i; done
Run Code Online (Sandbox Code Playgroud)

命令2:

bash -c "for ((i=0; i<10; i=i+1)); do echo $i; done"
Run Code Online (Sandbox Code Playgroud)

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

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

长篇故事:

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

然后我可以使用以下方式获取输出:

bash my_script.sh > results.txt
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的任何建议.期待回复.
米莎

cdh*_*wie 10

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

您需要修复此行:

bash -c "for ((i=0; i<10; i=i+1)); do echo $i; done"
Run Code Online (Sandbox Code Playgroud)

改为说:

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

发生的事情是,$i正在运行bash的shell正在解释序列,并且它将自己的 i变量替换为字符串,然后将其传递给要执行的新bash实例.所以当新的bash看到字符串时,它是:

for ((i=0; i<10; i=i+1)); do echo 10; done
Run Code Online (Sandbox Code Playgroud)

假设i包含值"10".

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

  • 或者您可以将双引号更改为单引号. (4认同)
  • @misha:在StackOverflow上,"谢谢.这解决了我的问题"在答案的左边表示为绿色勾号.偶尔会有一个upvote. (3认同)