Если вы не возражаете против использования подстановки команд, существует функция, которая позволит вам возвращать строки, -eval'd вызывающей программе, что позволяет вам вызывать run_local_var_assignments
созданную вами функцию таким образом:
$(run_local_var_assignments)
Функция выглядит так:
emit () {
local IFS=$'\n'
printf 'eval eval %q' "$*"
}
Он выдает оператор eval, очень похожий на ваш eval "$variable_name"
выше. Поскольку это первая вещь в результирующей строке, bash запускает сгенерированный eval как команду.
Двойное вычисление и экранирование %q, выполняемые функцией, существуют просто потому, что они необходимы для правильной передачи символов новой строки и других специальных символов вызывающей программе.
Ваша функция может быть записана:
run_local_var_assignments () {
local assignments=()
assignments+=( 'local myvar1="my value1"' )
assignments+=( 'local myvar2="my value2"' )
emit "${assignments[@]}"
}
Присваивания записываются так же, как если бы они были исходным кодом, поэтому такие вещи, как пробелы в значениях, требуют кавычек, как указано выше.
Вызов этой функции в подстановке команд (, как указано в верхней части этого ответа ), создаст эти локальные переменные в области действия вызывающей стороны с этими значениями.
Вы также можете использовать обычную строку или heredoc вместо массива операторов, но я часто нахожу метод массива полезным для динамического построения блока операторов, поэтому я решил показать, что это даже немного сложнее. сложный.