bash 循环如何精确工作?

bash 循环如何精确工作?
for i in {0..999999999}; do echo "hi"; done

需要很长时间才能写入它的输出,就好像所有的echos 首先执行然后发送到stdout.cowfortune使用 代替效果更加明显,echo并且使终端缓冲不太可能成为问题。

那么,当我一步步执行上述命令时,到底会发生什么?为什么会延迟?

答案1

普通for循环总是迭代一组静态字符串。这与字符串是由大括号扩展还是由文件名通配模式生成,或者变量或命令替换的其他扩展等生成无关。

对于for循环,您可以使用大括号扩展生成要循环的字符串。在循环的第一次迭代运行之前,必须先展开大括号展开。由于您生成如此庞大的单词列表(每个单词都是 0 到 999999999 范围内的 10 亿个整数),这可能需要一些时间(并且可能需要超过 8 GB 的 RAM)。

如果您确实需要在 中进行此类迭代bash,请改用算术for循环:

for (( i=0; i <= 999999999; ++i )); do echo hi; done

...或以其他方式解决特定问题

yes hi | head -n 1000000000

...或者考虑使用几乎任何其他语言来完成您手头的任务,因为 shell 脚本语言对于此类任务很少有效。

相关内容