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

问题描述 投票:0回答:2

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

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

我的问题:如何在第二个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 &

谢谢!

linux bash loops infinite-loop updating
2个回答
0
投票

增加变量的行:

((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

0
投票

你不能用变量做到这一点。

通过在每个循环结束时使用&符号,您正在分配该过程,即您正在创建一个将运行循环代码的新进程。这两个新进程中的每一个都有自己的地址空间==> counter_value与父进程中的地址空间不同。写入它将不会在父进程和兄弟进程中更改其值。只会更新本地的。

“我知道我可以将代码从循环中移动到函数中”

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.