我在第一个循环中增加变量的值,并在第二个循环中使用它。
我的问题:变量在第二个循环中没有变化。 (这是一个例子,我知道我可以移动代码将循环中的值更改为函数,但我有一个具有多个函数和多个循环的程序)。
我的问题:如何在第二个while循环中更新变量的值(在第一个while循环内增加)?
这是一个例子(第一个循环增加counter_value但第二个循环增加到“1”):
#!/bin/bash
counter_value="1"
function Print_counter_value () {
echo $counter_value ; }
#_____FIRST LOOP_____
while : ; do # infinite loop
#echo first loop works
counter_value=$[$counter_value+1]
echo $counter_value 1st_loop & sleep 2
done &
#_____SECOND LOOP_____
while : ; do # infinite loop
#echo second loop works
Print_counter_value & sleep 1
done &
谢谢!
增加变量的行:
((counter_value++))
没有必要将第二个循环放入后台。将变量保存到文件有点令人讨厌,但它确实有效。
#!/bin/bash
counter_value=1
file="/tmp/temp$$"
echo "counter_value=$counter_value" > "$file"
function Print_counter_value () {
echo $counter_value ; }
#_____FIRST LOOP_____
while : ; do # infinite loop
. "$file"
((counter_value++))
echo "counter_value=$counter_value" > "$file"
sleep 2
done &
#_____SECOND LOOP_____
while : ; do # infinite loop
. "$file"
Print_counter_value & sleep 1
done
你不能用变量做到这一点。
通过在每个循环结束时使用&
符号,您正在分配该过程,即您正在创建一个将运行循环代码的新进程。这两个新进程中的每一个都有自己的地址空间==> counter_value
与父进程中的地址空间不同。写入它将不会在父进程和兄弟进程中更改其值。只会更新本地的。
“我知道我可以将代码从循环中移动到函数中”
移动此代码不会改变任何内容。两个子进程都将调用此函数,但每个都会读/写自己的counter_value
,第一个循环的更改不会反映在第二个循环读取的内容中。
为了看到/“相信”它是一个不同的过程,你可以在循环内打印变量$$
(PID)和$BASHPID
(子进程的PID或子shell)。你会发现它们彼此不同。
如果您希望这些进程更新彼此必须使用的数据,如评论中所述,其他方法。请记住,您可能会遇到并发问题。