Как обновить значение переменной из цикла A в другой цикл B - в bash - PullRequest
0 голосов
/ 12 марта 2019

Я увеличиваю значение переменной в первом цикле и использую его во втором цикле.

Моя проблема: переменная не изменяется во втором цикле. (Это пример, я знаю, что могу переместить код, который изменяет значение из цикла в функцию, но у меня есть программа с несколькими функциями и несколькими циклами).

Мой вопрос: как обновить значение переменной (увеличивается внутри первого цикла 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 &

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Вы не можете сделать это с переменными.

Используя знак & в конце каждого цикла, вы разветвляете процесс, т. Е. Вы создаете новый процесс, который будет запускать код цикла. Каждый из этих двух новых процессов будет иметь свои собственные адресные пространства ==> counter_value отличается от одного в родительском процессе. Запись в него не изменит его значения ни в родительском процессе, ни в процессе родственного процесса. Только локальный будет обновлен.

«Я знаю, что могу переместить код, который изменяет значение из цикла, в функцию»

Перемещение этого кода ничего не изменит. Оба дочерних процесса будут вызывать эту функцию, но каждый будет читать / записывать свой собственный counter_value, и изменения первого цикла не будут отражены в том, что читает второй цикл.

Чтобы увидеть / «поверить» в то, что это другой процесс, вы можете напечатать внутри циклов переменные $$ (PID) и $BASHPID (PID дочернего процесса или вспомогательной оболочки). Вы заметите, что они отличаются друг от друга.

Если вы хотите, чтобы эти процессы обновляли данные друг друга, вам придется использовать, как указано в комментариях, другие методы. И помните, что у вас могут возникнуть проблемы с параллелизмом.

0 голосов
/ 12 марта 2019

Строка, которая увеличивает переменную:

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