Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    объединить значения для создания имени переменной

    объединить значения для создания имени переменной

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    объединить значения для создания имени переменной, RouterOS
     
    DimebagDarrell
    Guest
    #1
    0
    10.09.2021 23:03:00
    Мой код: :global $wan1 1; :put ("wanSta" . $wan1); возвращает «wanSta1», моя переменная тоже так называется. Если я хочу что-то назначить: :set ("wanStatus" . $wanIndex) 10 — ничего не возвращает.
     
     
     
    Sertik
    Guest
    #2
    0
    09.03.2023 07:35:00
    [:execute [/system script environment get [find where name=$variablename] value]] Эта строка последняя в скрипте. Некому ждать. Почему можно выполнить log info, а :put — нельзя? Непонятно. И так тоже не работает: :global test do={:log info мама} :local variablename "test" [[:parse "[/system script environment get [find where name=$variablename] value]"]]
     
     
     
    Sertik
    Guest
    #3
    0
    09.03.2023 08:14:00
    Я хочу создать функцию myFunc, желательно в отдельном скрипте, и вызывать её из другого скрипта без использования [$myFunc], а через вызов через окружение.
     
     
     
    Sertik
    Guest
    #4
    0
    07.11.2022 12:32:00
    Чтобы считать значение переменной внутри другой объявленной переменной:  
    :global testx [:parse “global $variablename;:global testx $$variablename”]
    :put $testx  

    В этом примере вы выводите имя переменной в значение другой переменной. А можно ли сделать наоборот? То есть отобразить значение переменной в имени другой переменной? И при этом чтобы она была объявлена?
     
     
     
    rextended
    Guest
    #5
    0
    07.11.2022 15:23:00
    Что? Примеры?
     
     
     
    Sertik
    Guest
    #6
    0
    11.11.2022 12:32:00
    Здравствуйте, скрипты RouterOS не поддерживают объявление переменных, имена которых берутся из значения других переменных. По вашему вопросу: переменная не объявлена в текущей области видимости, поэтому вы не можете получить её значение, пока в скрипт не будет добавлено ;global varname;. С уважением, Maris B. Если вы всё равно не знаете имя переменной, вы всё равно не сможете с ней работать в скрипте без объявления. Значит, вся суета с «динамическими переменными» теряет смысл.
     
     
     
    rextended
    Guest
    #7
    0
    11.11.2022 13:19:00
    Что ты вообще пишешь??? Кому ты отвечаешь??? Ты мне объясняешь, как работает мой скрипт???
     
     
     
    Sertik
    Guest
    #8
    0
    14.11.2022 06:41:00
    Действительно, объявить переменную с выражением :global $Var невозможно, но сделать это через :parse можно, как в вашем примере выше. Однако тогда получить к ней доступ можно будет только через :parse. Я немного поэкспериментировал с вашим методом и понял, что динамические переменные действительно могут существовать. Вы можете формировать их имена, присваивать и получать значения без предварительного объявления. Вот примеры для наглядности:

    :global variablename "test"

    Вы можете создавать «динамические переменные» с случайно сгенерированными именами и присваивать им значения:

    :local name
    :for i from=1 to 3 do={
    :set name ("$variablename"."$i")
    [[:parse ":global $name; set $name $i"]]
    }

    После этого в окружении появятся переменные test1=1, test2=2 и test3=3.

    Можно также получать значения из таких «динамических переменных», не зная их имён, а зная алгоритм их формирования:

    :for i from=1 to 3 do={
    :set name ("$variablename"."$i")
    [[:parse ":global $name; log error (\$$name+5)"]]
    }

    Всё работает, но непонятно, зачем это может быть полезно на практике? Наверное, в процессах сортировки?
     
     
     
    Sertik
    Guest
    #9
    0
    07.03.2023 09:42:00
    Итак, как можно подкинуть код в память и получить к нему доступ из скрипта Router OS?
     
     
     
    rextended
    Guest
    #10
    0
    07.03.2023 12:24:00
    Я никогда не писал «впихнуть код в память» (и не понимаю, что именно вы под этим имели в виду), так что не стоит говорить неточности. С помощью скриптинга можно создать скрипт в памяти (SCRIPT, а не скомпилированный CODE), а потом запустить его, но если вы ждёте, что об этом что-то будет явно сказано, то разочаруетесь — это преувеличение, но технически возможно. Минимальный пример на псевдокоде:  
    a = ":put "  
    b = "hello"  
    parse (a + b)  

    Напоминаю, что RouterOS — это не полноценный язык программирования, например, там нет чисел с плавающей точкой и так далее. Нельзя рассуждать со скриптами, как с языком программирования. Помните: вы также можете использовать это, чтобы получить значение глобальной переменной, которая ранее не была объявлена:  
    :global wan1 1  
    :global variablename "wanSta$wan1"  
    [:parse ":global $variablename \"10\""]
    # :put [[:parse ":global $variablename; :return \$$variablename"]]
    # другой способ:  
    :put [/system script environment get $variablename value]

    Но если в этом случае $variablename не существует, вы получите ошибку.
     
     
     
    Sertik
    Guest
    #11
    0
    07.03.2023 12:36:00
    Спасибо за совет.
     
     
     
    rextended
    Guest
    #12
    0
    07.03.2023 12:40:00
    P.S.: Работает только с глобальными переменными, не с локальными.
     
     
     
    Sertik
    Guest
    #13
    0
    07.03.2023 12:48:00
    Интересно, а можно ли запустить код из функции вот так? [:parse [/system script environment get $variablename value]] или :execute [/system script environment get $variablename value]
     
     
     
    rextended
    Guest
    #14
    0
    07.03.2023 12:50:00
    Почему бы и нет? Попробуй сам.
     
     
     
    Sertik
    Guest
    #15
    0
    08.03.2023 13:46:00
    Я пытался. Мне не удалось выполнить функцию таким образом.
     
     
     
    rextended
    Guest
    #16
    0
    08.03.2023 16:06:00
    На RouterOS 6.48.6 работает.  
    { :global test “:log info "ok parse with find"” :local variablename “test” [:parse [/system script environment get [find where name=$variablename] value]] }
    { :global test “:log info "ok execute with find"” :local variablename “test” [:execute [/system script environment get [find where name=$variablename] value]] }
    { :global test “:log info "ok parse directly"” :local variablename “test” [:parse [/system script environment get $variablename value]] }
    { :global test “:log info "ok execute directly"” :local variablename “test” [:execute [/system script environment get $variablename value]] }
     
     
     
    Sertik
    Guest
    #17
    0
    08.03.2023 19:32:00
    Оказалось, что не работает, так как я пробовал с :put. Работает с log info: {
    :global test ":log info мама"
    :local variablename "test"
    [:execute [/system script environment get [find where name=$variablename] value]]
    }, но не работает с put: {
    :global test ":put мама"
    :local variablename "test"
    [:execute [/system script environment get [find where name=$variablename] value]]
    }. Не понимаю почему?
     
     
     
    rextended
    Guest
    #18
    0
    08.03.2023 21:19:00
    Тебе нужен интерактивный терминал с этим скриптом? Запускай скрипт асинхронно в отдельном потоке. Команду выполняй без ожидания, и скрипт сразу перейдет к следующей строке, выполнение идет отдельно. Вывода в терминал не будет.
     
     
     
    rextended
    Guest
    #19
    0
    09.03.2023 08:46:00
    Это одна функция, а не одна переменная, внутри которой находится одна строка, представляющая один скрипт для последующего сравнения с помощью парсинга или выполнения. «(eval /log infomessage=mama)» — это НЕ один скрипт, а [бесполезный] скомпилированный заранее код.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры