Mikrotik. Скрипты. Массивы
Одномерный массив
Объявление массива
В самом простом случае массив объявляется такими способами:
:global array1 [:toarray "1,2,3"]
:global arrayNum {1;2;3}
:global arrayStr {"n1";"n2";"n3"}
Строковые значения без пробелов почти везде можно не закрывать кавычками. Но для повышения "читабельности" кода и этого маленького "почти", лучше все-таки использовать кавычки.
Количество элементов в массиве. Функция :len:
:put [:len $arrayStr]
Получить элемент из массива по его индексу можно командой :pick:
Нумерация элементов массива начинается с нуля.
:put [:pick $arrayStr 1]
или
:put ($arrayStr->1)
В обоих случаях результатом будет: n2
Причем единицу можно заменить переменной, например $i
:for i from=0 to=([:len $arrayStr]-1) do={:put ($arrayStr->$i)}
n1 n2 n3
Структура цикла foreach
После ключевого слова foreach, объявляем переменную х. В неё один за одним будут помещаться элементы массива ( in=$array ). После выполняем действие для элементов массива ( do={:put $x;} )
:foreach x in=$array1 do={:put $x;};
Примеры
Добавляем в массив tvUsersArray последовательно все адреса из адрес-листа _tv_users
:global "tvUsersArray" [:toarray ""];
:foreach i in=[/ip firewall address-list find where list=_tv_users] do={
:set "tvUsersArray" ($"tvUsersArray", [/ip firewall address-list get value-name=address number=$i]);
}
То же самое в одну строку
:global "alertInitiatorIpArray" [:toarray ""]; :foreach i in=[/ip firewall address-list find where list=alertStart] do={:set "alertInitiatorIpArray" ($"alertInitiatorIpArray", [/ip firewall address-list get value-name=address number=$i]);}
Двумерный массив
Добавляем двумерный массив с элементами hp-garage, hp-ohrana (а также параметрами, и значениями этих параметров)
:global arrNetDevs {
"hp-garage"={"name"="hp-garage-name"; "ip"="192.168.1.250";};
"hp-ohrana"={"name"="hp-ohrana-name"; "ip"="192.168.1.251";};
}
Вывод значения параметра ip элемента hp-garage
:put (("$arrNetDevs" -> "hp-garage") -> "ip")
... 192.168.1.250 ...
Вывод значений параметров каждого элемента массива и использование этих значений в командах
# for each netdev in array of net devs
:foreach netDev in=$arrNetDevs do={
# vars
:local netDevName (($netDev) -> "name");
:local netDevIp (($netDev) -> "ip");
:local netDevIpPingCountReceived [/ping $netDevIp count=3] ;
# debug
:put "$netDevName";
:put "$netDevIp";
:put "$netDevIpPingCountReceived";
};