Mikrotik RouterOS-脚本-语法入门

简介:

最近要写一个routeros的script,但对其语法十窍九通,故而整理此文,以作参阅。

同时也发扬一下共享的精神,整理后的文稿就放出来供各博友参阅,有不对的地方欢迎指正。

1、命令行使用

1.1、命令行语法

[prefix] [path] command [uparam] [param=[value]] .. [param=[value]]

[prefix] - 前缀,以"."或"/"开头(字符用来表达路径除外),可选

[path] - 命令菜单层相对路径,可选

cmdmand - 命令,必选

[uparam] - 非注明参数(纯值),可选

[param=[value]] - 注明参数名称=值,可选

":"

非注明参数写法

1
2
[admin@MikroTik] >:put  "cmdschool.org"
cmdschool.org

注明参数写法:

1
2
[admin@MikroTik] >:put message= "cmdschool.org"
cmdschool.org

"/"

1
2
3
4
[admin@MikroTik] >/ip address print
  #   ADDRESS            NETWORK         INTERFACE
  0   192.168.1.1/24     192.168.1.0     bridge01
  1 D 119.128.4.27/32    119.128.4.1     ChinaNet

1.2、命令行的结束

";"与回车标志命令行结束并执行,当命令包含在"{}" or "[]" or "()"中可以不需要结束符。

";"使用演示:

1
2
3
[admin@MikroTik] >:put  "cmdschool" ; :put  ".org" ;
cmdschool
.org

1
2
3
4
[admin@MikroTik] >:put  "cmdschool" ;
cmdschool
[admin@MikroTik] >:put  ".org" ;
.org

"回车"使用演示:

1
2
3
4
[admin@MikroTik] >:put  "cmdschool"
cmdschool
[admin@MikroTik] >:put  ".org"
.org

"{}"使用演示:

1
2
[admin@MikroTik] >{:put  "cmdschool.org" }
cmdschool.org

"[]"使用演示:

1
2
3
4
[admin@MikroTik] >[
                      :put  "cmdschool.org"
                    ]
cmdschool.org

"()"使用演示:

1
2
[admin@MikroTik] >put (1+4)
5

1.3、行注解

以"#"开头的行,整行命令被忽略处理(不执行)

1
2
[admin@MikroTik] >#:put cmdschool.org
[admin@MikroTik] >

1.4、逻辑行

以"\"结尾的行与下一行组成一个逻辑行(相当于一个物理行),当一行命令处理。

1
2
3
4
5
[admin@MikroTik] >:put  "cmdschool.org"
cmdschool.org
[admin@MikroTik] >:put "cmdschool\
                    .org"
cmdschool.org

1.5、常用命令

Opearator Syntax Description Example
"/"
到达跟
".."
返回上一级目录
?

帮助命令
global

:global <var> [<value>]

定义全局变量
local

:local <var> [<value>]

定义本地变量
beep

:beep <freq> <length>

内置扬声器产生蜂鸣
delay :delay <time> 暂停一段时间
put :put <expression> 标准输出
len :len <expression> 返回字符串长度
typeof :typeof <var> 返回变量的数据类型
pick

:pick <var

<start> <end>

返回数组元素或子字符串的范围
log
:log <topic> 返回执行命令所用的时间间隔
time :time <expression>

set :set <var> [<value>] 赋值已经声明的变量
find

:find <arg> <arg> <start>

返回子字符串或数组元素的位置
environment

:environment print <start>

输出已初始化全局变量信息
terminal
控制台相关命令
error :error <output> 终止脚本运行并产生标准错误输出
parse

:parse <expression>

输出查询的命令解析
resolve :resolve <arg> DNS解析命令(域名翻译成IP地址)
toarray
:toarray <var> 将变量转换为数组类型
tobool :tobool <var> 将变量转换为布尔类型
toid :toid <var> 将变量转换为internal id类型
toip :toip <var> 将变量转换为IP地址
toip6 :toip6 <var>

将变量转换为IPv6地址


tonum :tonum <var> 将变量转换为整型
totime :totime <var> 将变量转换为time型

"/"命令

1
2
3
4
[admin@MikroTik] >/ip address
[admin@MikroTik] /ip address>
[admin@MikroTik] /ip address>/
[admin@MikroTik] >

".."命令

1
2
3
4
[admin@MikroTik] >/ip address
[admin@MikroTik] /ip address>
[admin@MikroTik] /ip address>..
[admin@MikroTik] /ip>

"?"命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[admin@MikroTik] >
[admin@MikroTik] /ip address>?
IP addresses are given to router to access it remotely and to specify it as a gateway  for  other hosts/routers.
 
.. -- go up to ip
add -- Create a  new  item
comment -- Set comment  for  items
disable -- Disable items
edit --
enable -- Enable items
export -- Print or save an export script that can be used to restore configuration
find -- Find items by value
get -- Gets value of item's property
print -- Print values of item properties
remove  -- Remove item
set -- Change item properties
[admin@MikroTik] /ip address>

"beep"命令

1
2
3
[admin@MikroTik] >:beep length=2s
[admin@MikroTik] >:beep length=2s frequency=500
[admin@MikroTik] >

"delay"命令

1
2
[admin@MikroTik] >:delay 2;
[admin@MikroTik] >

"put"命令

1
2
3
[admin@MikroTik] >:put  "cmdschool.org" ;
cmdschool.org
[admin@MikroTik] >

"len"命令

1
2
3
[admin@MikroTik] >:put [:len  "cmdschool.org" ];
13
[admin@MikroTik] >

"typeof"命令

1
2
3
4
[admin@MikroTik] >:put [:typeof 4];
num
[admin@MikroTik] >:put [:typeof a];
str

"pick"命令

1
2
3
[admin@MikroTik] >:put [:pick  "cmdschool.org"  0 9];
cmdschool
[admin@MikroTik] >

"log"命令

1
2
3
4
5
[admin@MikroTik] >: log  print
[admin@MikroTik] >: log  info message= "cmdschool" ;
[admin@MikroTik] >: log  print
17:39:24 script,info cmdschool
[admin@MikroTik] >

"time"命令

1
2
3
[admin@MikroTik] >:put [: time  [:resolve www.baidu.com];];
00:00:00.002257
[admin@MikroTik] >

"find"命令

1
2
3
[admin@MikroTik] >:put [:find  "cmdschool.org"  "." ];
9
[admin@MikroTik] >

"environment"命令

1
2
3
4
[admin@MikroTik] >:global cmdschool  "cmdschool.org" ;
[admin@MikroTik] >:environment print;
cmdschool= "cmdschool.org"
[admin@MikroTik] >

"error"命令

1
2
3
4
5
6
7
8
[admin@MikroTik] >{
                         :put  "start" ;
                         :error message= "error x01" ;
                         :put  "end" ;
                    }
start
error x01
[admin@MikroTik] >

"parse"命令

1
2
3
4
5
6
7
[admin@MikroTik] >:put [:parse value=resolve]
(eval /resolve)
[admin@MikroTik] >:put [:parse value=put]
(eval /put)
[admin@MikroTik] >:put [:parse value=cmdschool.org]
(<%% bad command name cmdschool.org (line 1 column 1) cmdschool.org)
[admin@MikroTik] >

"resolve"命令

1
2
3
[admin@MikroTik] >:put [:resolve www.baidu.com;]
180.97.33.108
[admin@MikroTik] >


2、特殊字符

2.1、转义字符:

Opearator Description Example
"\" 转义字符

特殊字符"\":

1
2
[admin@MikroTik] >:put  "\"" ;
"

2.2、转义字符常量

下面的转义序列可以用于在字符串内定义特殊的字符。

\" 插入双引号

1
2
[admin@MikroTik] >:put  "\"" ;
"

\\ 插入反斜杠

1
2
[admin@MikroTik] >:put  "\\" ;
\

\n 插入新的一行

1
2
3
4
5
[admin@MikroTik] >:put  "cmdschool.org" ;
cmdschool.org
[admin@MikroTik] >:put  "cmdschool\n.org" ;
cmdschool
          .org

\t 插入水平制表符

1
2
[admin@MikroTik] >:put  "cmdschool\t.org" ;
cmdschool       .org

\$ 输出 $ 字符. 否则 $ 用于引用变量.

1
2
[admin@MikroTik] >:put  "\$" ;
  $

\? 输出 ? 字符. 否则 ? 是用于在控制台中输出 "help"

1
2
[admin@MikroTik] >:put  "\?" ;
  ?

\_ 空格

1
2
[admin@MikroTik] >:put  "cmdschool\_.org" ;
cmdschool .org

\a BEL (0x07)

1
2
[admin@MikroTik] >:put  "cmdschool\_.org" ;
cmdschool .org

\b 退格 (0x08)

1
2
[admin@MikroTik] >:put  "cmdschool.\borg" ;
cmdschoolorg

\f 换页 (0xFF)

1
2
3
4
5
6
7
8
[admin@MikroTik] >:put  "cmdschool\f.org" ;
.org
 
 
 
 
 
[dgadmin@MikroTik]  /ip  address>

\v 插入垂直制表符

1
2
3
[admin@MikroTik] >:put  "cmdschool\v.org" ;
cmdschool
          .org

\r 插入回车

\xx 从16进制数值输出字符,十六进制数值应该用大写字母对应的。

3、运算符

3.1、算术运算符

Opearator Description Example
"+" binary addition :put (3+4);
"-" binary subtraction :put (1-6);
"*" binary multiplication

:put (4*5);

"/"
binary division :put (10/2);
"-" unary negation {:local a 1; :put (-a)}

"+"运算符:

1
2
[admin@MikroTik] >:put (3+4);
7

"-"运算符:

1
2
[admin@MikroTik] >:put (1-6);
-5

"*"运算符:

1
2
[admin@MikroTik] >:put (4*5);
20

"/"运算符:

1
2
[admin@MikroTik] >:put (10/2);
5

"-"运算符:

1
2
[admin@MikroTik] >{:local a 1; :put (-a)}
-1

3.2、关系运算符

Opearator Description Example
"<" 小于 :put (3<4);
">" 大于 :put (3>4);
"=" 等于

:put (2=2);

"<="
小于等于
">=" 大于等于
"!=" 不等于


"<"运算符:

1
2
[admin@MikroTik] >:put (3<4);
true

">"运算符:

1)example1

1
2
[admin@MikroTik] >:put (3>4);
false

2)example2

1
2
[admin@MikroTik] >:put (2>2);
true

3.3、逻辑运算符

Opearator Description Example
"!","not" logical NOT :put (!true);
"&&","and" logical AND :put (true&&true);
"||","or" logical OR

:put (true||false);

"in"

:put (1.1.1.1/32 in 10.0.0/8);

"!"运算符:

1
2
[admin@MikroTik] >:put (! true );
false

"&&"运算符:

1
2
[admin@MikroTik] >:put ( true && true );
true

"||"运算符:

1
2
[admin@MikroTik] >:put ( true || false );
true

"in"运算符:

1
2
[admin@MikroTik] >:put (1.1.1.1/32 in 10.0.0/8);
false

3.4、位运算符

Opearator Description Example
"~" 比特位倒置

:put (~(0.0.0.0))

:put (~(255.255.255.255))

"|"

比特位或:执行逻辑的或运算。在每一对对应的比特位,如果连个比特位至少有一个值为1,则结果为

“1”否则结果为“0”。

:put ((0.0.0.0) | (0.0.0.0))

:put ((0.0.0.1) | (0.0.0.0))

:put ((0.0.1.0) | (0.0.0.1))

"^" 比特位抑或:如果一对比特位的值不相等结果为1,比特位的值相等结果为0。

:put ((0.0.0.0) ^ (0.0.0.0))

:put ((0.0.0.1) ^ (0.0.0.1))

:put ((0.0.0.0) ^ (0.0.0.1))

"&"

逻辑和:如果比特对的值均为1结果为1,否则结果为0。

:put ((0.0.0.1) & (0.0.0.1))

:put ((0.0.0.0) & (0.0.0.0))

:put ((0.0.0.0) & (0.0.0.1))

"<<" 左移给定数量的比特位。

:put (0.0.0.1 <<1)

:put (0.0.0.1 <<2)

:put (0.0.0.1 <<4)

">>" 右移给定数量的比特位。

:put (0.0.0.2 >>1)

3.5、连接运算符

Opearator Description Example
"." 连接两个字符串
"," 连接两个数组或者增加新元素导数组

"."运算符:

1
2
3
4
5
6
[admin@MikroTik] >{
                      :local a  "cmdschool" ;
                      :local a  ".org" ;
                      :put ($a.$b);
                    }
cmdschool.org

3.6、其他运算符:

Opearator Description Example
"{}" 包含多行的命令集,当做一条指令来处理

{

:local i 1;

:put $i;

}

"[]" 命令替换,可以包含单个命令行 :put [:len "cmdschool.org";];
"()" 子表达式或者分组运算符 :put ("value is"(4+5));
"$" 替换运算符 :global a 5; :put $a;
"~" 二进制操作符用来匹配扩展的正则表达式的值 Print all routes which gateway ends with 202

“{}”运算符:

1
2
3
4
5
[admin@MikroTik] >{
                      :local a cmdschool.org;
                      :put $a;
                    }
1

"[]"运算符:

1
2
[admin@MikroTik] >:put [:len  "cmdschool.org" ;];
13

"()"运算符:

1)分组运算符

1
2
[admin@MikroTik] >:put (3+4);
7

2)子表达式

1
2
[admin@MikroTik] >:put ( "=" .(3+4));
=7

"$"运算符:

1
2
3
4
[admin@MikroTik] >:local a 5; :put $a;
5
[admin@MikroTik] >:put ( "=$(3+4)" );
=7

4、变量的使用

4.1、变量作用域

global - 定义全局变量,路由内全局有效

local - 定义本地变量,同一行物理行或逻辑行内有效,逻辑行指包含在“{}”中的代码。

4.2、变量定义

:global

定义全局变量

1
2
3
[admin@MikroTik] >:global a cmdschool.org;
[admin@MikroTik] >:put $a;
cmdschool.org

:local

定义本地变量

1
2
[admin@MikroTik]>:local a cmdschool.org; :put $a;
cmdschool.org

变量的命名可以是字母、数字、特殊字符,但当包含特殊字符时一定要包含在双引号内,变量名大小写敏感。

1
2
3
4
5
6
7
8
9
10
11
12
[admin@MikroTik] >:local a cmdschool.org; :put $a;
cmdschool.org
[admin@MikroTik] >:local 1 cmdschool.org; :put $1;
cmdschool.org
[admin@MikroTik] >:local  "*"  cmdschool.org; :put $ "*" ;
cmdschool.org
[admin@MikroTik] >{
                      :local A  "cmdschool" ; :put $A;
                      :local a  ".org" ; :put $a;
                    }
cmdschool
.org

4.3、变量赋值与引用

:set

赋值

1
[admin@MikroTik] >: set  "cmdschool.org" ;

将字符串“cmdschool.org”赋给变量a

1
2
3
4
5
6
[admin@MikroTik] >{
                      :local a;
                      :set a cmdschool.org;
                      :put $a
                    }
cmdschool.org;

4.4、变量的类型

Opearator Description Example
num 64位带符号整数类型
bool 布尔类型,值为true或false
str 字符串类型
ip IP地址类型
id '*'为前缀的十六进制值
time 时间类型
array 数组类型

nothing 默认变量类型(未赋值前)

number:

1
2
3
4
5
6
7
8
9
[admin@MikroTik] >{
                      :local a;
                      :set a 1000;
                      :put $a;
                      :put [:typeof $a];
                    }
1000
num
[admin@MikroTik] >

boolean:

1
2
3
4
5
6
7
8
9
10
11
[admin@MikroTik] >{
                      :local a; :local b;
                      :set a  true ; :set b  false ;
                      :put $a; :put $b;
                      :put [:typeof $a]; :put [:typeof $b];
                    }
true
false
bool
bool
[admin@MikroTik] >

string:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[admin@MikroTik] >{
                      :local a;
                      :set a cmdschool.org;
                      :put $a; 
                      :put [:typeof $a];
                    }
cmdschool.org
str
[admin@MikroTik] >{
                      :local b;
                      :set b  "cmdschool.org" ;
                      :put $b;
                      :put [:typeof $b];
                    }
cmdschool.org
str
[admin@MikroTik] >

ip:

1
2
3
4
5
6
7
8
9
[admin@MikroTik] >{
                      :local a;
                      :set a  "192.168.1.1" ;
                      :put $a;
                      :put [:typeof $a];
                    }
192.168.1.1
ip
[admin@MikroTik] >

错误的使用方法:

1
2
3
4
5
6
7
8
9
[admin@MikroTik] >{
                      :local b;
                      :set b  "192.168.1.1" ;
                      :put $b;
                      :put [:typeof $b];
                    }
192.168.1.1
str
[admin@MikroTik] >

internal id:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[admin@MikroTik] >:local a *0x0; :put $a; :put [typeof $a];
*0x0
id
[admin@MikroTik] >:local a *0x9; :put $a; :put [typeof $a];
*0x9
id       
[admin@MikroTik] >:local a *0xa; :put $a; :put [typeof $a];
*0xa
id 
[admin@MikroTik] >:local a *0xf; :put $a; :put [typeof $a];
*0xf
id  
[admin@MikroTik] >:local a *0xg; :put $a; :put [typeof $a];
*0xg
str  
[admin@MikroTik] >

合法字符:1-9,a-f

可以省略"0x":

1
2
3
[admin@MikroTik] >:local a *f; :put $a; :put [typeof $a];
*f
id

time:

1
2
3
4
5
6
7
8
9
[admin@MikroTik] >{
                      :local a;
                      :set a 08:00:01;
                      :put $a;
                      :put [:typeof $a];
                    }
08:00:01
time
[admin@MikroTik] >

nothing:

1
2
3
4
5
6
7
8
[admin@MikroTik] >{
                      :local a;
                      :put $a;
                      :put [:typeof $a];
                    }
 
nothing
[admin@MikroTik] >

4.5、变量或函数保留关键字

and or not in beep execute global list pick time toip typeof

delay find if local put toarray tonum while

do for led log resolve tobool tostr

environment foreach len nothing set toid totime

5、逻辑结构

5.1、顺序结构

:if

1)example1

1
2
[admin@MikroTik] >: if  (1<2)  do ={:put  true };
true

2)example2

1
2
3
4
5
6
[admin@MikroTik] >: if  (1<2)  do  {
                       put  true ;
                       put ^-^
                    };
true
^-^

3)example3

1
2
[admin@MikroTik] >: if  (1>2)  do ={:put  true else ={:put flase};
flase

4)example4

1
2
3
4
5
6
7
8
[admin@MikroTik] >: if  (1>2)  do  {
                       :put  true
                    else ={
                       :put flase
                       :put ^-^
                    };
flase
^-^

5.2、循环结构

:while

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[admin@MikroTik] >:local i; :set i 0; : while  ($i<5)  do ={:put $i;:set i ($i+1)};
0
1
2
3
4
[admin@MikroTik] >{
                     :local i;
                     :set i 1;
                     : while  ($i<=5)  do  {
                       :put $i;
                       :set i ($i+1)
                     }
                   }
1
2
3
4     
5

:for

1
2
3
4
5
6
7
8
9
10
11
[admin@MikroTik] >:local i; : for  i from=1 to=100 step=30  do ={:put $i;};
1
31
61
91
[admin@MikroTik] >{
                     :local i;
                     : for  i from 1 to 5 step 1  do  {
                       :put $i;
                     }
                   }

:foreach

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[admin@MikroTik] >:local i; :foreach i in [/interface find type=ether]  do ={:put [/interface get $i name]}
ether01
ether02
ether03
ether04
ether05
ether06
ether07
ether08
ether09
ether10
sfp1
[admin@MikroTik] >{
                     :local i;
                     :foreach i in [/interface find type=ether]  do ={
                       :put [/interface get $i name]
                     }
                    }
ether01
ether02
ether03
ether04
ether05
ether06
ether07
ether08
ether09
ether10
sfp1

完善中……









本文转自 tanzhenchao 51CTO博客,原文链接:http://blog.51cto.com/cmdschool/1701302,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
监控 网络协议 Shell
【Shell 命令集合 网络通讯 】Linux 监控和记录网络中ARP(Address Resolution Protocol)活动 arpwatch命令 使用指南
【Shell 命令集合 网络通讯 】Linux 监控和记录网络中ARP(Address Resolution Protocol)活动 arpwatch命令 使用指南
34 0
|
算法 Shell 测试技术
Monkey 常用命令详解含高级参数应用
Monkey 常用命令详解含高级参数应用
Monkey 常用命令详解含高级参数应用
|
网络协议 网络安全
|
前端开发 测试技术 API
Cypress系列(69)- route() 命令详解
Cypress系列(69)- route() 命令详解
202 0
Cypress系列(69)- route() 命令详解
|
监控 Linux
zabbix-sender+crontab+nc实现无agent监控linux主机(二十六)
zabbix-sender+crontab+nc实现无agent监控 1.zabbix-sender介绍zabbix获取监控项值的每隔多少时间去主机上去取,有的自定义监控项脚本需要执行很长的时间,有时候根本没法监控,这时就可以用zabbix-sender直接给zabbix-server发送数据,不需要等待脚本取值的时间,也就是说脚本什么时候执行完,将执行的结果通过zabbix-sender直接给zabbix-server发送数据,zabbix-server也就不需要等待了
474 0
zabbix-sender+crontab+nc实现无agent监控linux主机(二十六)
|
域名解析 缓存 网络协议
host文件知识详解
host文件知识详解
|
Web App开发 网络协议 网络架构
python脚本实现ipv6的ddns功能
python脚本实现ipv6的ddns功能ipv6地址已经开始优先在三大运营商推广,我自己家用的就是联通宽带100M光纤入户。有一次,不经意间发现,我们的光猫竟然获取到了ipv6地址,于是我开始浮想联翩。
6674 1
|
监控 Unix 缓存
Zabbix zabbix_proxy指令(学习笔记二十八)
zabbix proxy概述 zabbix proxy可以代替zabbix server检索客户端的数据,然后把数据汇报给zabbix server,并且在一定程度上分担了zabbix server的压力。
1334 0
|
监控 Unix Windows
Zabbix zabbix_server指令(学习笔记二十五)
zabbix核心:zabbix_server zabbix可以没有zabbix_agentd,也可以没用snmp、也可以没有proxy,但是zabbix_server那是绝对不能少,它是zabbix最核心的东西。
1190 0