Добрый день!
Пытаюсь учиться писать свои скрипты, для домашних целей, но столкнулся с переменной 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 и соответственно ничего не отправляется, если эту же строчку выполнить в терминале, то она срабатывает.
Подскажите пожалуйста, это вообще возможно, правда ли что глобальные переменные передаются во все скрипты созданные пользователем или быть может их в другом скрипте сначала нужно как-то хитро вызвать.
Переменная global
-
- Сообщения: 1778
- Зарегистрирован: 09 июл 2014, 12:33
Вроде "глобал" они работают для скриптов, вызванных из того, где были объявлены?
-
- Сообщения: 12
- Зарегистрирован: 13 окт 2017, 10:47
Erik_U писал(а):Вроде "глобал" они работают для скриптов, вызванных из того, где были объявлены?
Так вот и хочется понять, так как информация в интернете разница, кто-то пишет, что во всех скриптах, кто-то пишет только в том, в котором создана, но в любом месте.
Просто странно, почему бы не использовать глобальную переменную во всех скриптах, если она доступна из терминала и видна по команде environment print. Лично мне думается, что ее нужно как-то по особому указать, но как я не нашел.
-
- Модератор
- Сообщения: 3605
- Зарегистрирован: 26 сен 2013, 14:20
- Откуда: НСК
- Контактная информация:
первый скрипт
{
:global test "Hello world!"
:put $test
}
result
Hello world!
Второй скрипт (первый выполнялся ранее)
{
:global test
:put $test
}
result
Hello world!
{
:global test "Hello world!"
:put $test
}
result
Hello world!
Второй скрипт (первый выполнялся ранее)
{
:global test
:put $test
}
result
Hello world!
Есть интересная задача и бюджет? http://mikrotik.site
-
- Сообщения: 10
- Зарегистрирован: 19 ноя 2019, 17:30
Тоже столкнулся с этим вопросом и поиск первым делом выдал этот пост. Но все равно разобрался не сразу. Поэтому уточню ответ (для будущих поколений):
Что бы глобальная переменная сохранилась необходимо в скрипте 1 установить галочку в Policy "policy" (см. картинку). Тогда, после запуска первого скрипта на закладке System/Scripts/Environment появится строчка с Вашей глобальной переменной.
Аналогично и во втором скрипте надо поставить галочку, что бы считать эту глобальную переменную.
Что бы глобальная переменная сохранилась необходимо в скрипте 1 установить галочку в Policy "policy" (см. картинку). Тогда, после запуска первого скрипта на закладке System/Scripts/Environment появится строчка с Вашей глобальной переменной.
Аналогично и во втором скрипте надо поставить галочку, что бы считать эту глобальную переменную.
Давайте жить дружно!
MikroTik RB951G-2HnD
MikroTik RB951G-2HnD
- hulitolku
- Сообщения: 34
- Зарегистрирован: 07 окт 2018, 11:59
У меня другая проблема.
Почему в терминале работает:
А в скрипте переменная не присваивается?
Policy стоит.
Почему в терминале работает:
Код: Выделить всё
:global dbm [/interface wireless registration-table get value-name=signal-strength 0 ]
Policy стоит.
- podarok66
- Модератор
- Сообщения: 4361
- Зарегистрирован: 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'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
-
- Сообщения: 1
- Зарегистрирован: 21 фев 2022, 10:05
У кого в скрипте не видит глобальную переменную объявленную не в скрипте,
то просто объявите ее в скрипте без присваивания ":global VarName;",
и все! будет видеть! у меня так прокатило!
по ходу это сделали для безопасности.
то просто объявите ее в скрипте без присваивания ":global VarName;",
и все! будет видеть! у меня так прокатило!
по ходу это сделали для безопасности.
-
- Сообщения: 2
- Зарегистрирован: 12 авг 2022, 14:09
Не прокатило. Переменная объявляется при старте микротика (шедуллер запускает скрипт, в котором указано вот такое - :global MyFault "0"; ). Потом эта переменная должна использоваться в 2 скриптах, которые запускает Netwatch. И при таком запуске скриптов - прочесть переменную не получается. Если запустить скрипт вручную - всё работает. Я слышал, что Netwatch покоцали. Может это оно? Версия прошивки 6.49.2.aleksey.perminov писал(а): ↑21 фев 2022, 10:10 У кого в скрипте не видит глобальную переменную объявленную не в скрипте,
то просто объявите ее в скрипте без присваивания ":global VarName;",