点击这里给我发消息      点击这里给我发消息


QQ: 358207017






首 页>技术信息>技术信息技术信息

作者: QQ:86698456  点击次数:   添加时间: 2017-03-12


Scripting language manual
This manual provides introduction to RouterOS built-in powerful scripting language. 
Scripting host provides a way to automate some router maintenance tasks by means of executing user-defined scripts bounded to some event occurrence. 
Scripts can be stored in Script repository or can be written directly to console. The events used to trigger script execution include, but are not limited to the System Scheduler, the Traffic Monitoring Tool, and the Netwatch Toolgenerated events. 
Line structure
RouterOS script is divided into number of command lines. Command lines are executed one by one until the end of script or until runtime error occur.
Command line
RouterOS console uses following command syntax:
[prefix] [path] command [uparam] [param=[value]] .. [param=[value]]
[prefix] - ":" or "/" character which indicates if command is ICE or path. May or may not be required.
[path] - relative path to the desired menu level. May or may not be required.
command - one of the commands available at the specified menu level.
[uparam] - unnamed parameter, must be specified if command requires it.
[params] - sequence of named parameters followed by respective values
The end of command line is represented by the token “;” or NEWLINE. Sometimes “;” or NEWLINE is not required to end the command line. 
Single command inside (), [] or {} does not require any end of command character. End of command is determined by content of whole script
:if ( true ) do={ :put "lala" }
Each command line inside another command line starts and ends with square brackets "[ ]" (command concatenation). 
:put [/ip route get [find gateway=]];
Notice that code above contains three command lines:
/ip route get
find gateway=
Command line can be constructed from more than one physical line by following line joining rules.
Physical Line
A physical line is a sequence of characters terminated by an end-of-line (EOL) sequence. Any of the standard platform line termination sequences can be used:
unix – ASCII LF;
windows – ASCII CR LF;
mac – ASCII CR;
Standard C conventions for new line characters can be used ( the \n character).
A comment starts with a hash character (#) and ends at the end of the physical line. Whitespace or any other symbols are not allowed before hash symbol. Comments are ignored by syntax. If (#) character appear inside string it is not considered a comment.
# this is a comment # bad comment :global a; # bad comment :global myStr "lala # this is not a comment"
Line joining
Two or more physical lines may be joined into logical lines using backslash character (\). A line ending in a backslash cannot carry a comment. A backslash does not continue a comment. A backslash does not continue a token except for string literals. A backslash is illegal elsewhere on a line outside a string literal.
: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)
Whitespace between tokens
Whitespace can be used to separate tokens. Whitespace is necessary between two tokens only if their concatenation could be interpreted as a different token. Example:
{  :local a true; :local b false; # whitespace is not required  :put (a&&b); # whitespace is required  :put (a and b); }
Whitespace are not allowed
between '='
between '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 = #correct /ip route add gateway=
Variables can be used only in certain regions of the script. These regions are called scopes. Scope determines visibility of the variable. There are two types of scopes - global and local. A variable declared within a block is accessible only within that block and blocks enclosed by it, and only after the point of declaration.
Global scope
Global scope or root scope is default scope of the script. It is created automatically and can not be turned off.
Local scope
User can define its own groups to block access to certain variables, these scopes are called local scopes. Each local scope is enclosed in curly braces ("{ }").
{  :local a 3; {  :local b 4;  :put ($a+$b); } #line below will generate error  :put ($a+$b); }
In code above variable b has local scope and will not be accessible after closed curly brace. 
Note: Each line written in terminal is treated as local scope
So for example, defined local variable will not be visible in next command line and will generate syntax error
[admin@MikroTik] > :local myVar a; [admin@MikroTik] > :put $myVar syntax error (line 1 column 7)
Warning: Do not define global variables inside local scopes.
Note that even variable can be defined as global, it will be available only from its scope unless it is not already defined.
{  :local a 3; {  :global b 4; }  :put ($a+$b); }
Code above will generate an error.
The following words are keywords and cannot be used as variable and function names:
and or not in
The following tokens serve as delimiters in the grammar:
() [] {}  :  ; $ /
Data types
RouterOS scripting language has following data types:
Type Description
number - 64bit signed integer, possible hexadecimal input;
boolean - values can bee true or false;
string - character sequence;
IP - IP address;
internal ID - hexadecimal value prefixed by '*' sign. Each menu item has assigned unique number - internal ID;
time - date and time value;
array - sequence of values organized in an array;
nil - default variable type if no value is assigned;
Constant Escape Sequences
Following escape sequences can be used to define certain special character within string:
\" Insert double quote
\\ Insert backslash
\n Insert newline
\r Insert carriage return
\t Insert horizontal tab
\$ Output $ character. Otherwise $ is used to link variable.
\? Output ? character. Otherwise ? is used to print "help" in console.
\_ - space
\a - BEL (0x07)
\b - backspace (0x08)
\f - form feed (0xFF)
\v Insert vertical tab
\xx Print character from hex value. Hex number should use capital letters.
:put "\48\45\4C\4C\4F\r\nThis\r\nis\r\na\r\ntest";
which will show on display
Arithmetic Operators
Usual arithmetic operators are supported in RouterOS scripting language
Opearator Description Example
"+" binary addition :put (3+4);
"-" binary subtraction :put (1-6);
"*" binary multiplication :put (4*5);
"/" binary division :put (10 / 2); :put ((10)/2)
"-" unary negation { :local a 1; :put (-a); }
Note: for division to work you have to use braces or spaces around dividend so it is not mistaken as IP address
Relational Operators
Opearator Description Example
"<" less :put (3<4);
">" greater :put (3>4);
"=" equal :put (2=2);
"<=" less or equal
">=" greater or equal
"!=" not equal
Logical Operators
Opearator Description Example
“!” , “not” logical NOT :put (!true);
“&&” , “and” logical AND :put (true&&true)
“||” , “or” logical OR :put (true||false);
“in” :put ( in;
Bitwise Operators
Bitwise operators are working on number and ip address data types.
Opearator Description Example
“~” bit inversion :put (~
“|” bitwise OR. Performs logical OR operation on each pair of corresponding bits. In each pair the result is “1” if one of bits or both bits are “1”, otherwise the result is “0”.
“^” bitwise XOR. The same as OR, but the result in each position is “1” if two bits are not equal, and “0” if bits are equal.
“&” bitwise AND. In each pair the result is “1” if first and second bit is “1”. Otherwise the result is “0”.
“<<” left shift by given amount of bits
“>>” right shift by given amount of bits
Concatenation Operators
Opearator Description Example
“.” concatenates two strings :put (“concatenate” . “ “ . “string”);
“,” concatenates two arrays or adds element to array :put ({1;2;3} , 5 );
It is possible to add variable values to strings without concatenation operator:
:global myVar "world"; :put ("Hello " . $myVar); # next line does the same as above :put "Hello $myVar";
By using $[] and $() in string it is possible to add expressions inside strings:
:local a 5; :local b 6; :put " 5x6 = $($a * $b)"; :put " We have $[ :len [/ip route find] ] routes";
Other Operators
Opearator Description Example
“[]” command substitution. Can contain only single command line :put [ :len "my test string"; ];
“()” sub expression or grouping operator :put ( "value is " . (4+5));
“$” substitution operator :global a 5; :put $a;
“~” binary operator that matches value against POSIX extended regular expression Print all routes which gateway ends with 202
/ip route print where gateway~"^[0-9 \\.]*202"