Вы не можете сделать это с переменными.
Используя знак &
в конце каждого цикла, вы разветвляете процесс, т. Е. Вы создаете новый процесс, который будет запускать код цикла. Каждый из этих двух новых процессов будет иметь свои собственные адресные пространства ==> counter_value
отличается от одного в родительском процессе. Запись в него не изменит его значения ни в родительском процессе, ни в процессе родственного процесса. Только локальный будет обновлен.
«Я знаю, что могу переместить код, который изменяет значение из цикла, в функцию»
Перемещение этого кода ничего не изменит. Оба дочерних процесса будут вызывать эту функцию, но каждый будет читать / записывать свой собственный counter_value
, и изменения первого цикла не будут отражены в том, что читает второй цикл.
Чтобы увидеть / «поверить» в то, что это другой процесс, вы можете напечатать внутри циклов переменные $$
(PID) и $BASHPID
(PID дочернего процесса или вспомогательной оболочки). Вы заметите, что они отличаются друг от друга.
Если вы хотите, чтобы эти процессы обновляли данные друг друга, вам придется использовать, как указано в комментариях, другие методы. И помните, что у вас могут возникнуть проблемы с параллелизмом.