如何将变量值从循环 A 更新到另一个循环 B - bash

How to update a variable value from a loop A to another loop B - in bash

我在第一个循环中增加变量的值并在第二个循环中使用它。

我的问题: 变量在第二个循环中没有改变。 (这是一个例子,我知道我可以将更改值的代码从循环移动到函数中,但我有一个包含多个函数和多个循环的程序)。

我的问题:如何在第二个 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 与父进程中的地址空间不同。写入它不会改变它在父进程和兄弟进程中的值。只会更新本地的。

"I know that I can move the code that changes the value from the loop into the function"

移动此代码不会改变任何内容。两个子进程都会调用此函数,但每个子进程都会 read/write 自己的 counter_value 并且第一个循环的更改不会反映在第二个循环读取的内容中。

为了看到/"believe"这是一个不同的进程,你可以在循环内部打印变量$$(PID)和$BASHPID(子进程的PID或子shell)。您会发现它们彼此不同。

如果您希望这些进程更新彼此的数据,您必须使用评论中提到的其他方法。请记住,您可能 运行 遇到并发问题。