Я хочу написать функцию, аналогичную встроенной 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 вообще не решают эту проблему.
Я тоже не могу использовать подоболочку, потому что тогда любые изменения глобальных переменных будут потеряны.
Есть ли способ для присвоения переменной с динамическим именем, как определено в контексте вызывающего ?