Я хочу написать функцию, аналогичную встроенной 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 вообще не помогают в моей проблеме.
Я также не могу использовать подоболочку, потому что тогда любые изменения глобальных переменных будут потеряны.
Есть ли способ назначить переменную с динамическим именем, как определено в контексте вызывающего объекта?
(Другими словами, я ищу bash-эквивалент Tcl upvar
< /а>.)
declare
делает переменные локальными, поэтому я не могу это использовать. И связанный ответ не помогает решить проблему в этом вопросе: его использование приводит кenvironment: warning: var: circular name reference
. - person user3840170   schedule 05.05.2020declare makes variables local
при использовании без конкретных аргументов — да. Почему это имеет значение?environment: warning: var: circular name reference
и нет никакого возможного решения этой проблемы. Итак,declare -n _pIcK_uNiQuE_NaMe_FoR_nAmE_rEfErEnCe="$1"
- person KamilCuk   schedule 05.05.2020declare
, на самом деле это не проблема; проблема в том, что namerefs указывают на переменные в контексте функции, а не на ее вызывающую сторону, как я хотел. - person user3840170   schedule 05.05.2020bash
есть простой способ сделать это. Удачи в отрицании ответов и попытках найти ответ - person Inian   schedule 05.05.2020