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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将变量值从循环A更新到另一个循环B - 在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与父进程中的地址空间不同。写入它将不会在父进程和兄弟进程中更改其值。只会更新本地的。

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

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

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

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

以上是关于如何将变量值从循环A更新到另一个循环B - 在bash中的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量值传递给julia中的宏?

通过单击鼠标将变量值传递给java中的servlet

如何将变量值与 select 语句的结果一起放入 sql 表中?

如何将变量值用作JS对象中的属性[重复]

如何将变量值“传递”给 JSON 动态对象?

excel中怎样用宏将变量值写到指定单元格中