راهنمای زبان اسکریپت
این راهنما مقدمه ای بر زبان برنامه نویسی قدرتمند داخلی RouterOS ارائه می دهد.
میزبان اسکریپت راهی برای خودکار کردن برخی از وظایف نگهداری روتر با استفاده از اجرای اسکریپت های تعریف شده توسط کاربر که به برخی از رویدادها محدود شده اند، ارائه می دهد.
اسکریپت ها را می توان در مخزن اسکریپت ذخیره کرد یا مستقیماً در کنسول نوشت . رویدادهایی که برای راه اندازی اجرای اسکریپت استفاده می شوند شامل، اما نه محدود به System Scheduler ، ابزار نظارت بر ترافیک ، و رویدادهای تولید شده از ابزار Netwatch هستند.
اگر قبلاً با اسکریپت نویسی در RouterOS آشنا هستید، ممکن است بخواهید نکات و ترفندهای ما را ببینید .
ساختار خط
اسکریپت RouterOS به تعدادی خط فرمان تقسیم می شود. خطوط فرمان یک به یک تا پایان اسکریپت یا تا زمانی که خطای زمان اجرا رخ دهد اجرا می شود.
خط فرمان
کنسول RouterOS از دستور دستور زیر استفاده می کند:
[prefix] [path] command [uparam] [param=[value]] .. [param=[value]]
- [prefix] – کاراکتر “:” یا “/” که نشان می دهد یک فرمان ICE یا مسیر است. ممکن است مورد نیاز نباشد.
- [path] – مسیر نسبی به سطح منوی مورد نظر. ممکن است مورد نیاز نباشد.
- command – یکی از دستورات موجود در سطح منوی مشخص شده.
- [uparam] – پارامتر بدون نام، در صورت نیاز دستور باید مشخص شود.
- [params] – دنباله ای از پارامترهای نامگذاری شده به دنبال مقادیر مربوطه
انتهای خط فرمان با علامت “;” نشان داده می شود. یا NEWLINE . گاهی اوقات “;” یا NEWLINE برای پایان دادن به خط فرمان لازم نیست.
تنها دستور داخل به هیچ کاراکتر پایان فرمان نیاز ندارد. پایان دستور با محتوای کل اسکریپت تعیین می شود (), [] or {}
:if ( true ) do={ :put "lala" }
هر خط فرمان داخل خط فرمان دیگری با براکت های مربع “[ ]” (الحاق فرمان) شروع و به پایان می رسد .
:put [/ip route get [find gateway=1.1.1.1]];
توجه داشته باشید که کد بالا شامل سه خط فرمان است:
- :قرار دادن
- ip route get
- find gateway=1.1.1.1
خط فرمان را می توان از بیش از یک خط فیزیکی با پیروی از قوانین اتصال خط ساخت .
خط فیزیکی
یک خط فیزیکی دنباله ای از نویسه ها است که با یک دنباله انتهای خط (EOL) خاتمه می یابد. می توان از هر یک از توالی های پایان خط پلت فرم استاندارد استفاده کرد:
- یونیکس – ASCII LF؛
- ویندوز – ASCII CR LF;
- مک – ASCII CR؛
می توان از قراردادهای استاندارد C برای کاراکترهای خط جدید استفاده کرد (کاراکتر \n).
نظرات
قوانین زیر برای نظر اعمال می شود:
- یک نظر با یک کاراکتر هش (#) شروع می شود و در انتهای خط فیزیکی به پایان می رسد.
- RouterOS از نظرات چند خطی پشتیبانی نمی کند.
- اگر یک کاراکتر # در داخل رشته ظاهر شود، یک نظر در نظر گرفته نمی شود.
مثال
# this is a comment
# next line comment
:global a; # another valid comment
:global myStr "part of the string # is not a comment"
پیوستن به خط
دو یا چند خط فیزیکی ممکن است با استفاده از کاراکتر بک اسلش (\) به خطوط منطقی متصل شوند.
قوانین زیر برای استفاده از بک اسلش به عنوان ابزار اتصال خط اعمال می شود:
- خطی که به بک اسلش ختم می شود نمی تواند نظر داشته باشد.
- بک اسلش نظر را ادامه نمی دهد.
- بک اسلش یک نشانه را به جز حروف الفبای رشته ای ادامه نمی دهد.
- بک اسلش در جاهای دیگر در خطی خارج از رشته به معنای واقعی کلمه غیرقانونی است.
مثال
:if ($a = true \
and $b=false) do={ :put "$a $b"; }
:if ($a = true \ # bad comment
and $b=false) do={ :put "$a $b"; }
# comment \
continued - invalid (syntax error)
فضای خالی بین نشانه ها
فضای خالی را می توان برای جدا کردن توکن ها استفاده کرد. فضای خالی بین دو نشانه فقط در صورتی ضروری است که الحاق آنها به عنوان یک نشانه متفاوت تفسیر شود. مثال
{
:local a true; :local b false;
# whitespace is not required
:put (a&&b);
# whitespace is required
:put (a and b);
}
کاراکترهای فضای خالی مجاز نیستند
- بین “<parameter>=”
- بین ‘from=’ ‘to=’ ‘step=’ ‘in=’ ‘do=’ ‘else=’
مثال:
#incorrect:
:for i from = 1 to = 2 do = { :put $i }
#correct syntax:
:for i from=1 to=2 do={ :put $i }
:for i from= 1 to= 2 do={ :put $i }
#incorrect
/ip route add gateway = 3.3.3.3
#correct
/ip route add gateway=3.3.3.3
محدوده ها
متغیرها را می توان فقط در مناطق خاصی از اسکریپت به نام scope استفاده کرد. این نواحی نمایان بودن متغیر را تعیین می کنند. دو نوع دامنه وجود دارد – جهانی و محلی. متغیر اعلام شده در یک بلوک فقط در آن بلوک و بلوک های محصور شده توسط آن و فقط پس از نقطه اعلام قابل دسترسی است.
گستره جهانی
گستره جهانی یا root scope محدوده پیش فرض اسکریپت است. به طور خودکار ایجاد می شود و نمی توان آن را خاموش کرد.
محدوده محلی
کاربر می تواند گروه های خود را برای مسدود کردن دسترسی به متغیرهای خاص تعریف کند، این محدوده ها محدوده های محلی نامیده می شوند. هر محدوده محلی در پرانتزهای فرفری (“{ }”) محصور شده است.
{
:local a 3;
{
:local b 4;
:put ($a+$b);
} #line below will show variable b in light red color since it is not defined in scope
:put ($a+$b);
}
در متغیر کد بالا، b دارای محدوده محلی است و پس از بسته شدن پرانتز قابل دسترسی نخواهد بود.
به عنوان مثال، متغیر محلی تعریف شده در خط فرمان بعدی قابل مشاهده نخواهد بود و یک خطای نحوی ایجاد می کند.
[admin@MikroTik] > :local myVar a;
[admin@MikroTik] > :put $myVar
syntax error (line 1 column 7)
توجه داشته باشید که حتی متغیر را می توان به عنوان جهانی تعریف کرد، فقط از محدوده خود در دسترس خواهد بود، مگر اینکه به آن ارجاع داده شود که خارج از محدوده قابل مشاهده باشد
{
:local a 3;
{
:global b 4;
}
:put ($a+$b);
}
کد بالا خروجی 3 می دهد، زیرا خارج از محدوده b قابل مشاهده نیست.
کد زیر مشکل را برطرف می کند و خروجی 7 را می دهد:
{
:local a 3;
{
:global b 4;
}
:global b;
:put ($a+$b);
}
کلید واژه ها
کلمات زیر کلمات کلیدی هستند و نمی توانند به عنوان نام متغیر و تابع استفاده شوند:
and or in
تعیین کننده ها
نشانه های زیر به عنوان جداکننده در دستور زبان عمل می کنند:
() [] {} : ; $ /
انواع داده ها
زبان برنامه نویسی RouterOS دارای انواع داده های زیر است:
نوع | شرح |
---|---|
num (number) | – عدد صحیح امضا شده 64 بیتی، ورودی هگزادسیمال ممکن. |
bool (boolean) | – مقادیر می تواند درست یا غلط باشد |
str (string) | – character sequence; |
ip | – آدرس آی پی؛ |
ip-prefix | – پیشوند IP؛ |
ip6 | – آدرس IPv6 |
ip6-prefix | – پیشوند IPv6 |
id (internal ID) | – مقدار هگزادسیمال با علامت “*” پیشوند. هر آیتم منو دارای یک شماره منحصر به فرد است – شناسه داخلی. |
time | – ارزش تاریخ و زمان؛ |
array | – دنباله ای از مقادیر سازماندهی شده در یک آرایه. |
nil | – نوع متغیر پیش فرض در صورتی که مقداری تخصیص داده نشود. |
دنباله های فرار ثابت
دنباله های فرار زیر را می توان برای تعریف کاراکترهای خاص در یک رشته استفاده کرد:
\” | درج دو نقل قول |
\\ | درج بک اسلش |
\n | درج خط جدید |
\r | درج کرییج برگشت |
\ t | درج زبانه افقی |
\$ | Output $ character. Otherwise از $ برای پیوند دادن متغیر استفاده می شود. |
\؟ | |
\_ | – فضا |
\آ | – BEL (0x07) |
\b | – Backspace (0x08) |
\f | – فید فرم (0xFF) |
\ v | درج زبانه عمودی |
\xx | یک کاراکتر چاپی از مقدار هگز. اعداد هگز باید از حروف بزرگ استفاده کنند. |
مثال
:put "\48\45\4C\4C\4F\r\nThis\r\nis\r\na\r\ntest";
که روی نمایشگر نشان داده خواهد شدHELLO
This
is
a
test
اپراتورها
عملگرهای حسابی
عملگرهای معمولی حسابی در زبان برنامه نویسی RouterOS پشتیبانی می شوند
اپراتور | شرح | مثال |
---|---|---|
“+” | اضافه دودویی | :put (3+4); |
“-“ | تفریق باینری | :put (1-6); |
“*” | ضرب دودویی | :put (4*5); |
“/” | تقسیم دودویی | :put (10 / 2); :put ((10)/2) |
“%” | عملیات مدولو | :put (5 % 3); |
“-“ | نفی واحد | { :local a 1; :put (-a); } |
توجه: برای اینکه تقسیم کار کند، باید از پرانتز یا فضاهای اطراف سود سهام استفاده کنید تا به عنوان یک آدرس IP اشتباه نشود.
اپراتورهای رابطه ای
اپراتور | شرح | مثال |
---|---|---|
“<“ | کمتر | :put (3<4); |
“>” | بزرگتر | :put (3>4); |
“=” | برابر | :put (2=2); |
“<=” | کمتر یا مساوی | |
“>=” | بزرگتر یا مساوی | |
“!=” | نا برابر |
عملگرهای منطقی
اپراتور | شرح | مثال |
---|---|---|
“!” | logical NOT | :put (!true); |
“&&”, “and” | logical AND | :put (true&&true) |
“||”, “or” | logical OR | :put (true||false); |
“in” | :put (1.1.1.1/32 in 1.0.0.0/8); |
اپراتورهای بیتی
اپراتورهای بیتی در حال کار بر روی انواع داده آدرس شماره، IP و IPv6 هستند .
اپراتور | شرح | مثال |
---|---|---|
“~” | وارونگی بیت | :put (~0.0.0.0) :put (~::ffff) |
“|” | بیتی OR. عملیات OR منطقی را روی هر جفت بیت مربوطه انجام می دهد. در هر جفت اگر یکی از بیت ها یا هر دو بیت “1” باشد، نتیجه “1” است، در غیر این صورت نتیجه “0” است. | :put (192.168.88.0|0.0.0.255) :put (2001::1|::ffff) |
“^” | به صورت بیتی XOR. همان OR است، اما نتیجه در هر موقعیت “1” است اگر دو بیت مساوی نباشند و “0” اگر بیت ها مساوی باشند. | :put (1.1.1.1^255.255.0.0) :put (2001::ffff:1^::ffff:0) |
“&” | به صورت بیتی و. در هر جفت، اگر بیت اول و دوم “1” باشد، نتیجه “1” است. در غیر این صورت، نتیجه “0” است. | :put (192.168.88.77&255.255.255.0) :put (2001::1111&ffff::) |
“<<“ | تغییر سمت چپ با مقدار معینی از بیت ها، برای نوع داده آدرس IPv6 پشتیبانی نمی شود | :put (192.168.88.77<<8) |
“>>” | جابجایی به راست توسط مقدار معینی از بیت ها، برای نوع داده آدرس IPv6 پشتیبانی نمی شود | :put (192.168.88.77>>24) |
آدرس زیر شبکه را از IP داده شده و CIDR Netmask با استفاده از عملگر “&” محاسبه کنید:
{
:local IP 192.168.88.77;
:local CIDRnetmask 255.255.255.0;
:put ($IP&$CIDRnetmask);
}
8 بیت آخر را از آدرس های IP داده شده دریافت کنید:
:put (192.168.88.77&0.0.0.255);
از “|” استفاده کنید اپراتور و ماسک CIDR معکوس برای محاسبه آدرس پخش:
{
:local IP 192.168.88.77;
:local Network 192.168.88.0;
:local CIDRnetmask 255.255.255.0;
:local InvertedCIDR (~$CIDRnetmask);
:put ($Network|$InvertedCIDR)
}
اپراتورهای الحاق
اپراتور | شرح | مثال |
---|---|---|
“.” | دو رشته را به هم متصل می کند | :put ("concatenate" . " " . "string"); |
“” | دو آرایه را به هم متصل می کند یا یک عنصر به آرایه اضافه می کند | :put ({1;2;3} , 5 ); |
اضافه کردن مقادیر متغیر به رشته ها بدون عملگر الحاق امکان پذیر است:
:global myVar "world";
:put ("Hello " . $myVar);
# next line does the same as above
:put "Hello $myVar";
با استفاده از $[] و $() در رشته می توان عباراتی را در داخل رشته ها اضافه کرد:
:local a 5;
:local b 6;
:put " 5x6 = $($a * $b)";
:put " We have $[ :len [/ip route find] ] routes";
سایر اپراتورها
اپراتور | شرح | مثال |
---|---|---|
“[]” | تعویض فرمان می تواند تنها شامل یک خط فرمان باشد | :put [ :len "my test string"; ]; |
“()” | عملگر فرعی یا گروه بندی | :put ( "value is " . (4+5)); |
“$” | اپراتور تعویض | :global a 5; :put $a; |
“~” | عملگر باینری که مقدار را با عبارت منظم توسعه یافته POSIX مطابقت می دهد | تمام مسیرهایی که دروازه آنها به 202 ختم می شود را چاپ کنید/ip route print where gateway~"^[0-9 \\.]*202\$" |
“->” | یک عنصر آرایه به کلید دریافت کنید | [admin@x86] >:global aaa {a=1;b=2} [admin@x86] > :put ($aaa->"a") 1 [admin@x86] > :put ($aaa->"b") 2 |
متغیرها
زبان برنامه نویسی دارای دو نوع متغیر است:
- جهانی – قابل دسترسی از تمام اسکریپت های ایجاد شده توسط کاربر فعلی، تعریف شده با کلمه کلیدی جهانی .
- محلی – فقط در محدوده فعلی قابل دسترسی است که با کلمه کلیدی محلی تعریف شده است .
ممکن است متغیرهای تعریف نشده ای وجود داشته باشد . وقتی متغیری تعریف نشده باشد، تجزیهکننده سعی میکند به دنبال متغیرهای تنظیمشده، بهعنوان مثال، توسط DHCP lease-script یا Hotspot در ورود به سیستم باشد.
هر متغیر، به جز متغیرهای RouterOS داخلی، باید قبل از استفاده توسط کلمات کلیدی محلی یا سراسری اعلام شود. متغیرهای تعریف نشده به عنوان تعریف نشده علامت گذاری می شوند و منجر به خطای کامپایل می شوند. مثال:
# following code will result in compilation error, because myVar is used without declaration
:set myVar "my value";
:put $myVar
کد صحیح:
:local myVar;
:set myVar "my value";
:put $myVar;
استثنا زمانی است که از متغیرهای تنظیم شده، به عنوان مثال، توسط DHCP lease-script استفاده کنید
/system script
add name=myLeaseScript policy=\
ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api \
source=":log info \$leaseActIP\r\
\n:log info \$leaseActMAC\r\
\n:log info \$leaseServerName\r\
\n:log info \$leaseBound"
/ip dhcp-server set myServer lease-script=myLeaseScript
کاراکترهای معتبر در نام متغیرها حروف و اعداد هستند. اگر نام متغیر حاوی هر کاراکتر دیگری باشد، نام متغیر باید در دو گیومه قرار گیرد. مثال:
#valid variable name
:local myVar;
#invalid variable name
:local my-var;
#valid because double quoted
:global "my-var";
اگر یک متغیر در ابتدا بدون مقدار تعریف شود، نوع داده متغیر روی صفر تنظیم می شود ، در غیر این صورت، یک نوع داده به طور خودکار توسط موتور برنامه نویسی تعیین می شود. گاهی اوقات تبدیل از یک نوع داده به نوع دیگر مورد نیاز است. با استفاده از دستورات تبدیل داده می توان به آن دست یافت . مثال:
#convert string to array
:local myStr "1,2,3,4,5";
:put [:typeof $myStr];
:local myArr [:toarray $myStr];
:put [:typeof $myArr]
نام متغیرها به حروف بزرگ و کوچک حساس هستند.
:local myVar "hello"
# following line will generate error, because variable myVAr is not defined
:put $myVAr
# correct code
:put $myVar
دستور Set بدون مقدار متغیر را از حالت تعریف خارج می کند (حذف از محیط، جدید در نسخه 6.2)
#remove variable from environment
:global myVar "myValue"
:set myVar;
زمانی که نام متغیر شامل عملگرها باشد، از نقل قول در نام کامل متغیر استفاده کنید. مثال:
:local "my-Var";
:set "my-Var" "my value";
:put $"my-Var";
نام متغیرهای رزرو شده
همه ویژگی های RouterOS داخلی متغیرهای رزرو شده هستند. متغیرهایی که مشابه ویژگی های داخلی RouterOS تعریف می شوند، می توانند باعث ایجاد خطا شوند. برای جلوگیری از چنین خطاهایی، از عناوین سفارشی استفاده کنید.
به عنوان مثال، اسکریپت زیر کار نخواهد کرد:
{
:local type "ether1";
/interface print where name=$type;
}
اما با متغیرهای تعریف شده متفاوت کار خواهد کرد:
{
:local customname "ether1";
/interface print where name=$customname;
}
دستورات
دستورات جهانی
هر دستور جهانی باید با نشانه “:” شروع شود ، در غیر این صورت، به عنوان یک متغیر در نظر گرفته می شود
/ | go to the root menu | |||
.. | go back by one menu level | |||
? | list all available menu commands and brief descriptions | |||
global | :global <var> [<value>] | define a global variable | :global myVar "something"; :put $myVar; | |
local | :local <var> [<value>] | define the local variable | { :local myLocalVar "I am local"; :put $myVar; } | |
beep | :beep <freq> <length> | beep built-in speaker | ||
convert | :convert from=[arg] to=[arg] | Converts specified value from one format to another. By default uses an automatically parsed value, if the “from” format is not specified (for example, “001” becomes “1”, “10.1” becomes “10.0.0.1”, etc.). from specifies the format of the value – base32, base64, hex, raw, rot13, uri. to specifies the format of the output value – base32, base64, hex, raw, rot13, URI. |
| |
delay | :delay <time> | do nothing for a given period of time | ||
environment | :environment print <start> | print initialized variable information | :global myVar true; :environment print; | |
error | :error <output> | Generate console error and stop executing the script | ||
execute | :execute <expression> | Execute the script in the background. The result can be written in the file by setting a “file” parameter or printed to the CLI by setting “as-string”. When using the “as-string” parameter executed script is blocked (not executed in the background). |
| |
find | :find <arg> <arg> <start> | return position of a substring or array element | :put [:find "abc" "a" -1]; | |
jobname | :jobname | return current script name | Limit script execution to single instance
| |
len | :len <expression> | return string length or array element count | :put [:len "length=8"]; | |
log | :log <topic> <message> | write a message to the system log. Available topics are "debug, error, info and warning" | :log info "Hello from script"; | |
parse | :parse <expression> | parse the string and return parsed console commands. Can be used as a function. | :global myFunc [:parse ":put hello!"]; | |
pick | :pick <var> <start>[<count>] | return range of elements or substring. If the count is not specified, will return only one element from an array.
|
| |
put | :put <expression> | put the supplied argument into the console | :put “Hello world” | |
resolve | :resolve <arg> | return the IP address of the given DNS name | :put [:resolve "www.mikrotik.com"]; | |
retry | :retry command=<expr> delay=[num] max=[num] on-error=<expr> | Try to execute the given command “max” amount of times with a given “delay” between tries. On failure, execute the expression given in the “on-error” block | :retry command={abc} delay=1 max=2 on-error={:put “got error”}
| |
typeof | :typeof <var> | the return data type of variable | :put [:typeof 4]; | |
rndnum | :rndnum from=[num] to=[num] | random number generator | :put [:rndnum from=1 to=99]; | |
rndstr | :rndstr from=[str] length=[num] | Random string generator. from specifies characters to construct the string from and defaults to all ASCII letters and numerals. |
| |
set | :set <var> [<value>] | assign value to a declared variable. | :global a; :set a true; | |
terminal | :terminal | terminal related commands | ||
time | :time <expression> | return interval of time needed to execute the command | :put [:time {:for i from=1 to=10 do={ :delay 100ms }}]; | |
timestamp | :timestamp | returns the time since epoch, where epoch is January 1, 1970 (Thursday), not counting leap seconds |
| |
toarray | :toarray <var> | convert a variable to the array | ||
tobool | :tobool <var> | convert a variable to boolean | ||
toid | :toid <var> | convert a variable to internal ID | ||
toip | :toip <var> | convert a variable to IP address | ||
toip6 | :toip6 <var> | convert a variable to IPv6 address | ||
tonum | :tonum <var> | convert a variable to an integer | ||
tostr | :tostr <var> | convert a variable to a string | ||
totime | :totime <var> | convert a variable to time |
دستورات خاص منو
دستورات رایج
دستورات زیر از اکثر زیر منوها در دسترس هستند:
add | add <param>=<value>..<param>=<value> | add new item |
remove | remove <id> | remove selected item |
enable | enable <id> | enable selected item |
disable | disable <id> | disable selected item |
set | set <id> <param>=<value>..<param>=<value> | change selected items parameter, more than one parameter can be specified at the time. The parameter can be unset by specifying ‘!’ before the parameter. Example: |
get | get <id> <param>=<value> | get the selected item’s parameter value |
print <param><param>=[<value>] | print menu items. Output depends on the print parameters specified. The most common print parameters are described here | |
export | export [file=<value>] | export configuration from the current menu and its sub-menus (if present). If the file parameter is specified output will be written to the file with the extension ‘.rsc’, otherwise the output will be printed to the console. Exported commands can be imported by import command |
edit | edit <id> <param> | edit selected items property in the built-in text editor |
find | find <expression> | Returns list of internal numbers for items that are matched by given expression. For example: :put [/interface find name~"ether"] |
وارد كردن
دستور import از منوی ریشه در دسترس است و برای وارد کردن پیکربندی از فایل های ایجاد شده توسط یک فرمان صادرات یا نوشته شده به صورت دستی با دست استفاده می شود.
پارامترهای چاپ
چندین پارامتر برای دستور چاپ موجود است:
append | ||
as-value | print output as an array of parameters and its values | :put [/ip address print as-value] |
brief | print brief description | |
detail | print detailed description, the output is not as readable as brief output but may be useful to view all parameters | |
count-only | print only count of menu items | |
file | print output to a file | |
follow | print all current entries and track new entries until ctrl-c is pressed, very useful when viewing log entries | /log print follow |
follow-only | print and track only new entries until ctrl-c is pressed, very useful when viewing log entries | /log print follow-only |
from | print parameters only from specified item | /user print from=admin |
interval | continuously print output in a selected time interval, useful to track down changes where follow is not acceptable | /interface print interval=2 |
terse | show details in a compact and machine-friendly format | |
value-list | show values single per line (good for parsing purposes) | |
without-paging | If the output does not fit in the console screen then do not stop, print all information in one piece | |
where | expressions followed by where parameters can be used to filter outmatched entries | /ip route print where interface="ether1" |
بیش از یک پارامتر را می توان در یک زمان مشخص کرد، به عنوان مثال، /ip route print count-only interval=1 where interface="ether1"
حلقه ها و عبارات شرطی
حلقه ها
فرمان | نحو | شرح |
---|---|---|
do..while | :do { <commands> } while=( <conditions> ); :while ( <conditions> ) do={ <commands> }; | دستورات را تا زمانی که یک شرط داده شده برآورده شود اجرا کنید. |
for | :for <var> from=<int> to=<int> step=<int> do={ <commands> } | دستورات را در تعداد معینی از تکرارها اجرا کنید |
foreach | :foreach <var> in=<array> do={ <commands> }; | دستورات را برای هر عنصر در یک لیست اجرا کنید |
بیانیه مشروط
فرمان | نحو | شرح |
---|---|---|
if | :if (<condition>) do={<commands>} else={<commands>} <expression> | اگر یک شرط داده شده است، دستورات را در بلوک اجرا کنید ، در غیر این صورت اگر مشخص شده است ، دستورات را در بلوک اجرا کنید . true do else |
مثال:
{
:local myBool true;
:if ($myBool = false) do={ :put "value is false" } else={ :put "value is true" }
}
کارکرد
زبان اسکریپت به شما اجازه ایجاد مستقیم توابع را نمی دهد، با این حال، می توانید از دستور :parse به عنوان راه حل استفاده کنید.
با شروع از v6.2، دستور جدیدی برای تعریف آسان تر چنین توابعی و حتی پاس کردن پارامترها اضافه شده است. همچنین امکان برگرداندن مقدار تابع با دستور :return وجود دارد .
نمونه های زیر را ببینید:
#define function and run it
:global myFunc do={:put "hello from function"}
$myFunc
output:
hello from function
#pass arguments to the function
:global myFunc do={:put "arg a=$a"; :put "arg '1'=$1"}
$myFunc a="this is arg a value" "this is arg1 value"
output:
arg a=this is arg a value
arg '1'=this is arg1 value
توجه داشته باشید که دو روش برای ارسال آرگومان وجود دارد:
- arg را با یک نام خاص ارسال کنید (در مثال ما “a”)
- مقدار پاس بدون نام arg، در چنین مواردی arg “1”، “2” .. “n” استفاده می شود.
نمونه برگرداندن
:global myFunc do={ :return ($a + $b)}
:put [$myFunc a=6 b=2]
output:
8
حتی می توانید یک اسکریپت موجود را از محیط اسکریپت کلون کنید و از آن به عنوان یک تابع استفاده کنید.
#add script
/system script add name=myScript source=":put \"Hello $myVar !\""
:global myFunc [:parse [/system script get myScript source]]
$myFunc myVar=world
output:
Hello world !
مثلا:
:global my2 "123"
:global myFunc do={ :global my2; :put $my2; :set my2 "lala"; :put $my2 }
$myFunc my2=1234
:put "global value $my2"
خروجی خواهد بود:
1234
lala
global value 123
مثال تابع تو در تو
توجه: برای فراخوانی تابع دیگری باید نام آن اعلام شود (همانطور که برای متغیرها وجود دارد)
:global funcA do={ :return 5 }
:global funcB do={
:global funcA;
:return ([$funcA] + 4)
}
:put [$funcB]
Output:
9
خطاهای زمان اجرا را بگیرید
شروع از نسخه 6.2 اسکریپت نویسی این قابلیت را دارد که خطاهای زمان اجرا را بگیرد.
به عنوان مثال، دستور [code]:reslove[/code] در صورت عدم موفقیت، یک خطا ایجاد می کند و اسکریپت را خراب می کند.
[admin@MikroTik] > { :put [:resolve www.example.com]; :put "lala";}
failure: dns name does not exist
حالا می خواهیم این خطا را بگیریم و با اسکریپت خود ادامه دهیم:
:do {
:put [:resolve www.example.com];
} on-error={ :put "resolver failed"};
:put "lala"
output:
resolver failed
lala
عملیات با آرایه ها
اخطار: نام کلید در آرایه حاوی هر کاراکتری غیر از حروف کوچک است، باید در گیومه قرار داده شود.
مثلا:
[admin@ce0] > {:local a { "aX"=1 ;; ay=2 }; :put ($a->"aX")}
1
از میان کلیدها و مقادیر حلقه بزنید
دستور “foreach” را می توان برای حلقه زدن کلیدها و عناصر استفاده کرد:
[admin@ce0] > :foreach k,v in={2; "aX"=1 ;; y=2; 5} do={:put ("$k=$v")}
0=2
1=5
aX=1
y=2
اگر دستور “foreach” با یک آرگومان استفاده شود، مقدار عنصر برگردانده می شود:
[admin@ce0] > :foreach k in={2; "aX"=1 ;; y=2; 5} do={:put ("$k")}
2
5
1
2
توجه: اگر عنصر آرایه دارای یک کلید باشد، این عناصر به ترتیب حروف الفبا مرتب می شوند، عناصر بدون کلید قبل از عناصر دارای کلید منتقل می شوند و ترتیب آنها تغییر نمی کند (به مثال بالا مراجعه کنید).
مقدار یک عنصر آرایه را تغییر دهید
[admin@MikroTik] > :global a {x=1; y=2}
[admin@MikroTik] > :set ($a->"x") 5
[admin@MikroTik] > :environment print
a={x=5; y=2}
مخزن اسکریپت
سطح زیر منو: /system script
شامل تمام اسکریپت های ایجاد شده توسط کاربر است. اسکریپت ها را می توان به چند روش مختلف اجرا کرد:
- on event – اسکریپت ها به طور خودکار در برخی از رویدادهای تسهیلات اجرا می شوند ( زمان بندی ، netwatch ، VRRP )
- by another script – اجرای اسکریپت در داخل اسکریپت مجاز است
- manually – از کنسول اجرای دستور اجرا یا در winbox
توجه: فقط اسکریپتها (از جمله زمانبندیها، netwatch و غیره) با حقوق مجوز برابر یا بالاتر میتوانند اسکریپتهای دیگر را اجرا کنند.
ویژگی | شرح |
---|---|
comment (string; Default: ) | توضیحات توصیفی برای فیلمنامه |
dont-require-permissions (yes | no; Default: no) | بررسی مجوزهای دور زدن زمانی که اسکریپت در حال اجرا است، زمانی مفید است که اسکریپت ها از سرویس هایی که مجوزهای محدودی دارند، مانند Netwatch، اجرا می شوند. |
name (string; Default: “Script[num]”) | نام فیلمنامه |
policy (string; Default: ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon) | لیست سیاست های قابل اجرا:
توضیحات بیشتر سیاست را در اینجا بخوانید |
منبع ( رشته ؛) | کد منبع اسکریپت |
ویژگی های وضعیت فقط خواندنی:
ویژگی | شرح |
---|---|
last-started (date) | تاریخ و زمانی که اسکریپت آخرین بار فراخوانی شده است. |
owner (string) | کاربری که اسکریپت را ایجاد کرده است |
run-count (integer) | شمارنده ای که تعداد دفعات اجرای اسکریپت را محاسبه می کند |
دستورات خاص منو
فرمان | شرح |
---|---|
run (run [id|name]) | اسکریپت مشخص شده را با شناسه یا نام اجرا کنید |
محیط
سطح زیر منو:
/system script environment
/environment
شامل تمام متغیرهای تعریف شده توسط کاربر و مقادیر اختصاص داده شده به آنها می باشد.
[admin@MikroTik] > :global example;
[admin@MikroTik] > :set example 123
[admin@MikroTik] > /environment print
"example"=123
ویژگی های وضعیت فقط خواندنی:
ویژگی | شرح |
---|---|
name (string) | نام متغیر |
user (string) | کاربری که متغیر را تعریف کرده است |
value () | مقدار اختصاص داده شده به یک متغیر |
کار
سطح زیر منو: /system script job
حاوی لیستی از تمام اسکریپت های در حال اجرا است.
ویژگی های وضعیت فقط خواندنی:
ویژگی | شرح |
---|---|
owner (string) | کاربری که اسکریپت را اجرا می کند |
policy (array) | فهرست تمام خط مشی های اعمال شده در اسکریپت |
started (date) | تاریخ و زمان محلی شروع اسکریپت |