Mikrotik script добавление в массив

Кол-во просмотров: 1

Задача простая — прочитать смс, сверить номер отправителя со списком разрешенных, проверить текст сообщения и принять решение. Соответственно после обработки смс, нужно его удалить, но удалять во время обхода списка смс нельзя, т.к. массив сломается. Поэтому будем складывать id сообщений в массив, а для лога мне нужны еще номер и текст, значит будет массив из массивов размерностью 3. Добавить новый элемент в массив, что может быть легче и зачем тратить на это несколько часов?

Начнем с примеров реализации добавления в массив в консоли (скрипте) Mikrotik

Первый вариант добавления в массив

[admin@mikrotik] > :global $arr [:toarray ""]
[admin@mikrotik] > :set $arr{"0000000000001";"0000000000002";"0000000000003"}
[admin@mikrotik] > :put $arr0000000000001;0000000000002;0000000000003
[admin@mikrotik] > :put ($arr->1) 0000000000002
[admin@mikrotik] > :set $arr ($arr,"000000000000X")
[admin@mikrotik] > :put $arr0000000000001;0000000000002;0000000000003;000000000000X
[admin@mikrotik] > :put ($arr->3)000000000000X

Второй вариант добавления в массив (используем длину массива для получения следующего индекса, муторный путь, но работает)

 [admin@mikrotik] > :global $arr [:toarray ""]
[admin@mikrotik] > :set $arr {"0000000000001";"0000000000002";"0000000000003"} 
[admin@mikrotik] > :put $arr0000000000001;0000000000002;0000000000003
[admin@mikrotik] > :put ($arr->([:len $arr]-1)) 0000000000003[admin@mikrotik] > :set ($arr->([:len $arr])) "000000000000X"
[admin@mikrotik] > :put $arr0000000000001;0000000000002;0000000000003;000000000000X
[admin@mikrotik] > :put ($arr->3)000000000000X

Третий вариант добавления в массив — «именованный»

 [admin@mikrotik] > :global $arr [:toarray ""]
[admin@mikrotik] > :set $arr {"one"="0000000000001";"two"="0000000000002";"three"="0000000000003"} 
[admin@mikrotik] > :put $arrone=0000000000001;two=0000000000002;three=0000000000003
[admin@mikrotik] > :put ("$arr"->"two")0000000000002
[admin@mikrotik] > :set ("$arr"->"four") "0000000000004"
[admin@mikrotik] > :put $arrfour=0000000000004;one=0000000000001;three=0000000000003;two=0000000000002
[admin@mikrotik] > :put ($arr->"four")0000000000004

Четвертый вариант добавления — массив в массив из массивов (2D массив)

 [admin@mikrotik] > :global $arr [:toarray ""]
[admin@mikrotik] > :set $arr {{"0000000000001";"0000000000002";"0000000000003"};{"0000000000011";"0000000000022";"0000000000033"};{"0000000000111";"0000000000222";"0000000000333"}} 
[admin@mikrotik] > :put ($arr->1) 0000000000011;0000000000022;0000000000033
[admin@mikrotik] > :set $arr ($arr,{{"0000000000XXX";"0000000000ZZZ";"0000000000YYY"}})
[admin@mikrotik] > :put ($arr->3)0000000000XXX;0000000000ZZZ;0000000000YYY
[admin@mikrotik] > :put ($arr->0)0000000000001;0000000000002;0000000000003
[admin@mikrotik] > :put $arr 0000000000001;0000000000002;0000000000003;0000000000011;0000000000022;0000000000033;0000000000111;0000000000222;0000000000333;0000000000XXX;0000000000ZZZ;0000000000YYY

А вот в скрипте возникает какая-то хрень, точнее вывод показывал какую-то хрень, а по факту выяснилось, что в 2х смс (но я не смог найти на телефоне) последним символом сообщения был мать его перенос строки! Да!, вот этот — «\n» символ переноса строки. Да, его видно в Winbox если поместить значение в глобальную переменную, но я грешил не на смс, а на формирование самого массива. В связи с чем пришлось искать методы обхода:

 # Это функция, на входе текст, на выходе обработанный текст
:local RemoveLineBreak do={
	:local textM $1
	:local textMnew "";
	:for i from=0 to=([:len $textM] - 1) do={
	   :local char [:pick $textM $i];
       #:put ("|" . $char . "|") Вот так увидел что есть что-то лишнее еще на этапе получения текста из массива смс
	   :if ($char != "\n") do={
		   :set textMnew ($textMnew . $char);
		 };
	};
	:return $textMnew
}
#Применение, полагаем что TextSMS содержит в себе текст с переводом строки
:set TextSMS [ $RemoveLineBreak $TextSMS ]

Источник: https://www.qwased.xyz/2022/11/mikrotik-script.html

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика