Назначение переменной в родительском контексте в Bash - PullRequest
0 голосов
/ 05 мая 2020

Я хочу написать функцию, аналогичную встроенной read, где я передаю имя переменной в качестве аргумента, а функция возвращает свой результат в указанную переменную.

Я пробовал это сделать вот так:

GLOBAL_VAR=0

foo() {
    local var="$1"; shift
    local result

    # ...

    (( GLOBAL_VAR++ ))

    # ...

    eval "${var}=\${result}"
}

Однако есть проблема с приведенным выше: указанное выше не работает, если я вызываю foo с первым аргументом var или result, потому что тогда назначение становится локальной переменной, определенной внутри foo, а не вызывающей. Фактически, это приводит к утечке реализации foo.

Если я использую вместо nameref (local -n), запуск foo var приводит к предупреждению, а foo result ничего не возвращает вызывающему, потому что переменная result назначается внутри функции. Namerefs вообще не решают эту проблему.

Я тоже не могу использовать подоболочку, потому что тогда любые изменения глобальных переменных будут потеряны.

Есть ли способ для присвоения переменной с динамическим именем, как определено в контексте вызывающего ?

1 Ответ

0 голосов
/ 05 мая 2020

Я подозреваю, что вы получите что-то вроде:

foo() {
    local result
    result="some computation with $1"
    echo "$result"
}

thing=$(set -eu; foo)
...