如何将变量值从循环 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)。您会发现它们彼此不同。
如果您希望这些进程更新彼此的数据,您必须使用评论中提到的其他方法。请记住,您可能 运行 遇到并发问题。
我在第一个循环中增加变量的值并在第二个循环中使用它。
我的问题: 变量在第二个循环中没有改变。 (这是一个例子,我知道我可以将更改值的代码从循环移动到函数中,但我有一个包含多个函数和多个循环的程序)。
我的问题:如何在第二个 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)。您会发现它们彼此不同。
如果您希望这些进程更新彼此的数据,您必须使用评论中提到的其他方法。请记住,您可能 运行 遇到并发问题。