axsmak
@axsmak
Создатель

Как использовать глобальные переменные функции исполняемой в $()?

#!/bin/bash

export GLOBAL_VAR=1

function change_var {
    GLOBAL_VAR=$(($GLOBAL_VAR*2))
}

function print_var_out {
    echo "[out] Before: $GLOBAL_VAR"
    a=$(change_var)
    echo "[out] After: $GLOBAL_VAR"
}

function print_var_in {
    echo "[in] Before: $GLOBAL_VAR"
    change_var
    echo "[in] After: $GLOBAL_VAR"
}

print_var_out
print_var_in

Имеется функция change_var в скрипте, которая должна изменять глобальную переменную
Если просто вызвать функцию, как это делается в print_var_in, то всё работает правильно
Но если обернуть в $() как в print_var_out, то глобальная переменная не изменится
Как обойти, не используя файлы?

Вывод:
bin [master●●] % ./test.sh
[out] Before: 1
[out] After: 1
[in] Before: 1
[in] After: 2
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
По мотивам ответа на StackOverflow

Функция обновляет переменную last_call (уже не глобальную), результат присваивает переменной имя которой ей передали в параметрах и exit code работает как обычно.

#!/bin/bash

last_call=never

function f {
    local -n res=$1
    printf -v last_call '%(%x %X)T'
    res=$(($res * 2))
}

result=1

echo "Before: $last_call $result"
f result
echo "Return code: $?"
echo "After: $last_call $result"
sleep 1
f result
echo "Return code: $?"
echo "After: $last_call $result"


Вывод:
Before: never 1
Return code: 0
After: 06/16/2020 02:48:23 PM 2
Return code: 0
After: 06/16/2020 02:48:24 PM 4
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
a=$(change_var)
Вы здесь не просто выполняете функцию, а хотите присвоить переменной, a вывод функции.
Но ваша функция НИЧЕГО не выводит.

Вдобавок, здесь вы вполняете код, который запустится в подпроцессе. И изменение переменной будет выполнено в подпроцессе. Затем подпроцесс закрывается,а в основном процессе переменная не менялась.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы