为什么以下命令的标准输出有所不同?
命令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定义变量,所以它在空字符串中替换.)