LINUX.ORG.RU

Как получить доступ к локальным переменным в двух функциях?

 


0

1

Только локальные переменные нужны. Никаких глобальных

function f1 () {
   local var1 = some1
   local var2 = some2
}

function f2 () {
    f1  # <-- хотелось бы что-то такое. Типа загрузили f1 и имеем доступ к переменным, чтобы по 10 раз не дублировать var1 и var2 в f1...fx
    echo ${var1}
    echo ${var2}
}

function f3 () {
    f1
    echo ${var1}
    echo ${var2}
}
★★★★

Последнее исправление: bryak (всего исправлений: 4)
Ответ на: комментарий от Aceler

Тащемта это была шутка. Человеку уже предложили и local readonly и через контекст export…. Честно, в https://man7.org/linux/man-pages/man1/bash.1.html#PARAMETERS все возможные варианты описаны. да их не много, да они не привычные. но они есть

anonymous
()
function f1 () {
   local var1=some1
   local var2=some2
}

это у тебя типа конфиг к скрипту, так и выдели это в отдельный файл в виде

local.f1

local var1=some1
local var2=some2

И делай

function f2 () {
    . $CFG/local.f1
    echo ${var1}
    echo ${var2}
}
futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 1)
Ответ на: комментарий от futurama

Пускай делает так, как считает нужным: опыт, - сын ошибок трудных. Когда коленки и логти по обдирает в ЯП и поварится, сможет формулировать объективно и осознавать возможные решения более прозрачно.

ЗЫ, пример и только: https://man7.org/linux/man-pages/man1/sed.1.html#DESCRIPTION ключик -f

anonymous
()

Вы какую-то дичь спрашиваете, если честно. Локальные переменные потому, внезапно, и называтся локальными, что область их видимости ограничена (в вашем примере скоупом функции, в которой они создаются).

Вы хотите глобальные переменные, но при этом пишете, что их не хотите. Это взаимоисключающие хотелки, не находите?

Перепишите ваш код таким образом, чтобы функции вызывали друг друга с нужными аргументами. У вас проблема с дизайном вашего кода, а не с bash.

А тут, блин, дискуссия на две страницы, лол… :)

paddlewan
()
Последнее исправление: paddlewan (всего исправлений: 1)
Ответ на: комментарий от bryak

Без описания задачи, которую вы решаете, это ни о чем не говорит, если честно. Если это конфигурация, то зачем там вообще какие-то функции, может просто использовать структурированный формат (json, toml etc.)?

Или это какая-то обертка, которую вы сорсите (source) в другом скрипте, и он должна возвращать значения из этой самой конфигурации?

Какую задачу вы решаете?

paddlewan
()
Ответ на: комментарий от paddlewan

Вы хотите глобальные переменные, но при этом пишете, что их не хотите. Это взаимоисключающие хотелки, не находите?

Вот, жопой чую, что @bryak хочет (возможно неосознанно) динамические переменные из лиспа:

(defpackage :lor
  (:use :cl))

(in-package :lor)

(defvar *global-var* 'init)

(defun show-global ()
  (format t "global var is ~a~%" *global-var*))

(defun show-global2 ()
  (let ((*global-var* 'modified))
    (show-global)))

чтобы можно было одновременно использовать значение времени вызова функции (как с глобальными переменными), но при этом разные функции не портили состояние друг другу (как с локальными переменными):

LOR> *global-var*
INIT
LOR> (show-global)
global var is INIT
NIL
LOR> (show-global2)
global var is MODIFIED
NIL
LOR> (show-global)
global var is INIT

Короче, автор, переписывай с баша на лисп, будет тебе счастье.

ugoday ★★★★★
()

Выведи их из функции, у тебя обработчик не может заглянуть в прошлое - функция произошла, данные в оперативке - стерлись. Запиши их в глобал, потом оттуда бери.

repchick
()

И еще: ни в коем случае не делай, как кто то вше предложил, что функция будет вызывать функцию, так как если бы ты умел, то ты бы и не спросил вопрос, а значит ты вляпаешься потом. Лучше именно в глобал выведи, потом, как работать будет - удалишь отдельно - это называется оптимизация.

repchick
()