Mikrotik. Скрипты. Массивы

Материал из Wiki
Перейти к навигации Перейти к поиску

Одномерный массив

Объявление массива

В самом простом случае массив объявляется такими способами:

: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";
};