Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • 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
     
    Tal
    Guest
    #1
    0
    15.08.2015 02:45:00
    Есть ли способ использовать динамические имена для переменных? Например: :global VALUE true

    :foreach varname in "VAR1\n\rVAR2\n\rVAR3" do={  
    :global "$varname" $VALUE  
    }  

    Я бы подумал, что этот код должен работать, но нет, потому что :global не любит брать имя переменной из другой переменной. Есть ли способ обойти это?
     
     
     
    iamarpit
    Guest
    #2
    0
    26.11.2021 14:41:00
    Да, но это не работает в таком контексте. Если поставить пробел в значениях foreach key,value in={"VAR1"="foo with space"; "VAR2"="bar"} do={[parse "global $key $value"]}
     
     
     
    Winand
    Guest
    #3
    0
    04.08.2018 10:13:00
    Тебе просто нужны квадратные скобки: foreach varname in={"VAR1"; "VAR2"; "VAR3"} do={[parse "global $varname true"]}
     
     
     
    randomwalk
    Guest
    #4
    0
    16.12.2020 07:44:00
    Работает с глобальными, но невозможно с локальными. Есть ли какое-то решение для локальных переменных? Храните динамически создаваемые локальные переменные в массиве.

    {
       :local qty 9;           # количество переменных для создания
       :local varname "myvar"; # имя переменных

       :local myarray [:toarray ""]; # создаем пустой массив
       :for i from=1 to=$qty do={
           :local tmp ($varname . [:tostr $i]); # динамически формируем имя переменной
           :set ($myarray->$tmp) "";            # добавляем новую переменную в массив
       }
    # установка значений переменных
       :set ($myarray->"myvar1") "plaintext"
       :set ($myarray->"myvar2") {"abc"}
       :set ($myarray->"myvar3")
       :set ($myarray->"myvar4") true
       :set ($myarray->"myvar5") 127.0.0.1
       :set ($myarray->"myvar6") 23:59:59
       :set ($myarray->"myvar7") 192.168.88.0/24
       :set ($myarray->"myvar8") ::ffff:192.0.2.128
       :set ($myarray->"myvar9") 2001:0DB8:0000:000b::/64

    # чтение значений переменных
       :put ( "myvar1=" . ($myarray->"myvar1") . "   type=" . [:typeof ($myarray->"myvar1")] )
       :put ( "myvar2=" . ($myarray->"myvar2") . "   type=" . [:typeof ($myarray->"myvar2")] )
       :put ( "myvar3=" . ($myarray->"myvar3") . "   type=" . [:typeof ($myarray->"myvar3")] )
       :put ( "myvar4=" . ($myarray->"myvar4") . "   type=" . [:typeof ($myarray->"myvar4")] )
       :put ( "myvar5=" . ($myarray->"myvar5") . "   type=" . [:typeof ($myarray->"myvar5")] )
       :put ( "myvar6=" . ($myarray->"myvar6") . "   type=" . [:typeof ($myarray->"myvar6")] )
       :put ( "myvar7=" . ($myarray->"myvar7") . "   type=" . [:typeof ($myarray->"myvar7")] )
       :put ( "myvar8=" . ($myarray->"myvar8") . "   type=" . [:typeof ($myarray->"myvar8")] )
       :put ( "myvar9=" . ($myarray->"myvar9") . "   type=" . [:typeof ($myarray->"myvar9")] )
    }

    вывод:

    [admin@rb] > myvar1=plaintext type=str
    myvar2=abc   type=array
    myvar3=   type=nothing
    myvar4=true   type=bool
    myvar5=127.0.0.1   type=ip
    myvar6=23:59:59   type=time
    myvar7=192.168.88.0/24   type=ip-prefix
    myvar8=::ffff:192.0.2.128   type=ip6
    myvar9=2001:db8:0:b::/64   type=ip6-prefix
     
     
     
    PackElend
    Guest
    #5
    0
    29.03.2022 06:47:00
    Надеюсь, эта тема ещё активна, потому что у меня похожая задача.

    [admin@MikroTik] > :global vlancommon {id=100; name="VLAN_COMMON"; comment="COMMON SERVICES AND DEVICES / OFFICE"}

    [admin@MikroTik] > :put ($vlancommon)
    comment=COMMON SERVICES AND DEVICES / OFFICE;id=100;name=VLAN_COMMON

    [admin@MikroTik] > :put ($vlancommon->"name")
    vlancommon

    [admin@MikroTik] > :put ([ :toarray "UP, vlancommon ,KIDS" ]->1)
    vlancommon

    [admin@MikroTik] > :put (:parse "\$([ :toarray "UP, vlancommon ,KIDS" ]->1)"->"name")
    comment=COMMON SERVICES AND DEVICES / OFFICE;id=100;name=VLAN_COMMON

    Но я ожидал увидеть VLAN_COMMON в последней строке. Когда начинаю играть с кавычками, результат становится ещё страннее. Есть идеи, как должен выглядеть последний командный вызов, чтобы получить второй элемент массива vlancommon?

    И напоследок, как правильно модифицировать код, если я собираюсь использовать заглавные буквы и/или символы в имени переменной или ключа массива, чтобы их обязательно нужно было брать в кавычки?

    Спасибо, Стефан.
     
     
     
    PackElend
    Guest
    #6
    0
    29.03.2022 15:13:00
    Можно решить это так: нужно добавить ещё одну пару скобок, чтобы охватить команду parse: :put ( ( :parse "\$([ :toarray "UP, vlancommon ,KIDS" ]->1)" ) -> "name"). Ещё одна пара кавычек: :put ( ( :parse "\$\"([ :toarray "UP, vlancommon ,KIDS" ]->1)\"" )->"name").
     
     
     
    rextended
    Guest
    #7
    0
    29.03.2022 17:01:00
    Возвращаясь к вопросу автора темы, всё просто: http://forum.mikrotik.com/t/concatenate-values-to-create-variable-name/151793/2 Решение такое: :global variablename "test" Создаём или задаём значение (одной командой) [:parse ":global $variablename \"REX1\""] :put $test Задаём значение (или просто повторно применяем предыдущую команду) [:parse "global $variablename;:set $variablename \"REX2\""] :put $test Чтобы считать переменную внутри другой объявленной переменной: :global testx [:parse "global $variablename;:global testx $$variablename"] :put $testx
     
     
     
    PackElend
    Guest
    #8
    0
    30.03.2022 10:40:00
    Я тут ошибся, не протестировал «vlan_common». Есть идеи, как заставить работать :put((:parse "\$\"([:toarray "UP, vlan_common, KIDS"]->1)\"" )->"name")?
     
     
     
    rextended
    Guest
    #9
    0
    30.03.2022 11:51:00
    например, начните с удаления всех лишних пробелов: :put ">$([:toarray "UP, vlancommon ,KIDS"]->1)<"
    >vlancommon  <
    :put ">$([:toarray "UP,vlancommon,KIDS"]->1)<"
    >vlancommon<
     
     
     
    PackElend
    Guest
    #10
    0
    30.03.2022 12:10:00
    Попробуйте то же самое, но замените vlancommon на vlan_common. Результат будет таким:

    VLAN_COMMON из [admin@MikroTik] > :global "vlan_common" {id=100; name="VLAN_COMMON"; comment="ОБЩИЕ СЕРВИСЫ И УСТРОЙСТВА / ОФИС"}
     
     
     
    rextended
    Guest
    #11
    0
    30.03.2022 12:10:00
    Почему whu заменил “vlancommon” на vlan_common? Проблема в пробелах между элементами массива… и parse не выдает результатов, надо именно USE parse…

    :global vlancommon {id=100;name="VLAN_COMMON";comment="COMMON SERVICES AND DEVICES / OFFICE"}  
    :put ($vlancommon)  
    :put ($vlancommon->"name")  
    :put ([:toarray "UP,vlancommon,KIDS"]->1)
    :global testx  
    [:parse "global vlancommon;:global testx (\$$([:toarray "UP,vlancommon,KIDS"]->1)->\"id\")"]
    :put $testx  
    [:parse "global vlancommon;:global testx (\$$([:toarray "UP,vlancommon,KIDS"]->1)->\"name\")"]
    :put $testx  
    [:parse "global vlancommon;:global testx (\$$([:toarray "UP,vlancommon,KIDS"]->1)->\"comment\")"]
    :put $testx  

    [mikro@tik] > :global vlancommon {id=100;name=“VLAN_COMMON”;comment=“COMMON SERVICES AND DEVICES / OFFICE”}
    [mikro@tik] > :put ($vlancommon)
    comment=COMMON SERVICES AND DEVICES / OFFICE;id=100;name=VLAN_COMMON  
    [mikro@tik] > :put ($vlancommon->“name”)
    VLAN_COMMON  
    [mikro@tik] > :put ([:toarray “UP,vlancommon,KIDS”]->1)
    vlancommon  
    [mikro@tik] > :global testx
    [mikro@tik] > [:parse “global vlancommon;:global testx ($$([:toarray “UP,vlancommon,KIDS”]->1)->"id")”]
    [mikro@tik] > :put $testx
    100  
    [mikro@tik] > [:parse “global vlancommon;:global testx ($$([:toarray “UP,vlancommon,KIDS”]->1)->"name")”]
    [mikro@tik] > :put $testx
    VLAN_COMMON  
    [mikro@tik] > [:parse “global vlancommon;:global testx ($$([:toarray “UP,vlancommon,KIDS”]->1)->"comment")”]
    [mikro@tik] > :put $testx
    COMMON SERVICES AND DEVICES / OFFICE
     
     
     
    PackElend
    Guest
    #12
    0
    30.03.2022 12:17:00
    У меня получилось [mikro@tik] > :global vlancommon {id=100;name="VLAN_COMMON";comment="COMMON SERVICES AND DEVICES / OFFICE"}, но не [mikro@tik] > :global "vlan_common" {id=100;name="VLAN_COMMON";comment="COMMON SERVICES AND DEVICES / OFFICE"}, независимо от пробелов. Проблема в операциях с массивами — Manual:Scripting — MikroTik Wiki. Внимание: имя ключа в массиве, если содержит любой символ, кроме строчной буквы, должно быть взято в кавычки.
     
     
     
    rextended
    Guest
    #13
    0
    30.03.2022 12:20:00
    Почему ты путаешь карты? Я говорю о пробелах между элементами массива, а не о подчеркиваниях…
     
     
     
    PackElend
    Guest
    #14
    0
    30.03.2022 12:24:00
    Потому что мне хотелось бы узнать, как работать с этим: :global “vlan_common” {id=100;name=“VLAN_COMMON”;comment=“ОБЩИЕ СЕРВИСЫ И УСТРОЙСТВА / ОФИС”} #переменная должна быть в кавычках
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры