【发布时间】:2021-09-30 03:42:28
【问题描述】:
您可以像在 Bash、sh 等中一样将变量设置为子 shell 的输出。
$ var=$(echo "2")
$ echo $var
2
您还可以在循环完成后将变量设置为循环的输出。
$ i=0
$ var=$(while [ $i -ne 4 ]; do echo "$i"; i=$((i+1)); done)
$ echo "$var"
0
1
2
3
无论如何我可以分叉这个循环,让它永远运行,并且只要它被引用就得到最新版本的变量?我尝试了以下代码,但没有输出。
$ i=0
$ var=$(while true; do echo "$i"; i=$((i+1)); sleep 1; done) &
$ sleep 2
$ echo "$var"
我认为变量从未设置,因为循环从未完成。我希望这里的输出为“3”,如果两秒后我echo "$var",则输出“5”。正如@user2864740 所说,这个问题与在后台分叉的进程有关。如果我希望我的其余代码在无限循环运行时运行,这里有解决方案吗?
【问题讨论】:
-
这个问题与无限循环无关。它与通过后台作业更新变量有关。 (为什么没有设置变量的问题得出的结论也有点可疑。)
-
变量不是队列。您定义一个字符串,然后将该字符串作为值分配给名称。
-
或者您是否真的想要一个其值每秒递增一次的变量,例如
bash中的SECONDS? -
@chepner 差不多。我想要一个每秒更改一次(或其他时间单位)的变量,但我有一个通用用例,因此该变量需要可更改为任何字符串。真的,我会调用另一个函数并将其输出作为新变量。
-
这就是你必须做的;你不能在 POSIX shell 中实现你自己的自我更新变量。
标签: loops sh posix infinite-loop