Переменная global

Обсуждение ПО и его настройки
Ответить
mcheev
Сообщения: 12
Зарегистрирован: 13 окт 2017, 10:47

Добрый день!
Пытаюсь учиться писать свои скрипты, для домашних целей, но столкнулся с переменной global, логику которой не могу понять.
Искал информацию в интернете, но видимо мои кривые слова для поиска в Google не принесли результата.

Из найденной информации:
Язык допускает два типа переменных, глобальные и локальные.

global - доступно из всех скриптов, созданных текущим пользователем.
local - доступно только внутри текущей области видимости.

Собственное есть скрипт, в котором задаю переменные global и local
:global poolID "xxxxxxxxxxxxxxxxxxxxx" ;
:global myID "xxxxxxxxx" ;

:tool fetch url=("http://xxxxxxxxx.ru/".$poolID."/update\?you_id=".$myID."&count=1000.") keep-result=no ;
Это не весь скрипт конечно, но он в итоге отправляет значение.

Далее я делаю другой скрипт (отдельный), вставляю в него строчку:
:tool fetch url=("http://xxxxxxxxx.ru/".$poolID."/update\?you_id=".$myID."&count=1001.") keep-result=no ;
Но он уже не может получить значения global и соответственно ничего не отправляется, если эту же строчку выполнить в терминале, то она срабатывает.

Подскажите пожалуйста, это вообще возможно, правда ли что глобальные переменные передаются во все скрипты созданные пользователем или быть может их в другом скрипте сначала нужно как-то хитро вызвать.


Erik_U
Сообщения: 1752
Зарегистрирован: 09 июл 2014, 12:33

Вроде "глобал" они работают для скриптов, вызванных из того, где были объявлены?


mcheev
Сообщения: 12
Зарегистрирован: 13 окт 2017, 10:47

Erik_U писал(а):Вроде "глобал" они работают для скриптов, вызванных из того, где были объявлены?

Так вот и хочется понять, так как информация в интернете разница, кто-то пишет, что во всех скриптах, кто-то пишет только в том, в котором создана, но в любом месте.
Просто странно, почему бы не использовать глобальную переменную во всех скриптах, если она доступна из терминала и видна по команде environment print. Лично мне думается, что ее нужно как-то по особому указать, но как я не нашел.


vqd
Модератор
Сообщения: 3605
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

первый скрипт

{
:global test "Hello world!"
:put $test
}

result
Hello world!

Второй скрипт (первый выполнялся ранее)
{
:global test
:put $test
}

result
Hello world!


Есть интересная задача и бюджет? http://mikrotik.site
Jav
Сообщения: 10
Зарегистрирован: 19 ноя 2019, 17:30

Тоже столкнулся с этим вопросом и поиск первым делом выдал этот пост. Но все равно разобрался не сразу. Поэтому уточню ответ (для будущих поколений):

Что бы глобальная переменная сохранилась необходимо в скрипте 1 установить галочку в Policy "policy" (см. картинку). Тогда, после запуска первого скрипта на закладке System/Scripts/Environment появится строчка с Вашей глобальной переменной.
Аналогично и во втором скрипте надо поставить галочку, что бы считать эту глобальную переменную.
Изображение


Давайте жить дружно!
MikroTik RB951G-2HnD
Аватара пользователя
hulitolku
Сообщения: 34
Зарегистрирован: 07 окт 2018, 11:59

У меня другая проблема.
Почему в терминале работает:

Код: Выделить всё

:global dbm [/interface wireless registration-table get value-name=signal-strength 0 ]
А в скрипте переменная не присваивается?
Policy стоит.


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

После get открываем скобку и вбиваем строку поиска по признаку, например по МАС.

Код: Выделить всё

:global dbm [/interface wireless registration-table get [ find mac-address=xx:xx:xx:xx:xx:xx] value-name=signal-strength]
По номеру не получится, он для системы величина не постоянная и определяется каждый раз по новой.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
aleksey.perminov
Сообщения: 1
Зарегистрирован: 21 фев 2022, 10:05

У кого в скрипте не видит глобальную переменную объявленную не в скрипте,
то просто объявите ее в скрипте без присваивания ":global VarName;",
и все! будет видеть! у меня так прокатило!
по ходу это сделали для безопасности.


G-Tiger
Сообщения: 2
Зарегистрирован: 12 авг 2022, 14:09

aleksey.perminov писал(а): 21 фев 2022, 10:10 У кого в скрипте не видит глобальную переменную объявленную не в скрипте,
то просто объявите ее в скрипте без присваивания ":global VarName;",
Не прокатило. Переменная объявляется при старте микротика (шедуллер запускает скрипт, в котором указано вот такое - :global MyFault "0"; ). Потом эта переменная должна использоваться в 2 скриптах, которые запускает Netwatch. И при таком запуске скриптов - прочесть переменную не получается. Если запустить скрипт вручную - всё работает. Я слышал, что Netwatch покоцали. Может это оно? Версия прошивки 6.49.2.


Ответить