目录
继续讲ros脚本基础,此章讲ros变量。在ros中变量只有2种,全局变量和本地变量(一般开发中喜欢称局部变量)。
一、前言
在《RouterOS脚本(三):命令行结构》中的“命令行语法”中提到前缀有2种,斜杠"/"或冒号":"。
斜杠现在大家都可以知道怎么使用了吧,表示命令路径的,而“:”一般表示非命令路径的,比如变量、条件、循环语句等,脚本用得比较多。
和其它语言一样,一般都有全局变量和局部变量,在ros中没有静态变量。毕竟 ros的脚本并不像其它专业脚本语言,如javaScript、python等那样强大。
因变量放在内存中,重启后所有定义的变量会消失。
二、全局变量
2.1 全局变量定义
定义一个全局变量很简单,如下所示:
:global <变量名> <值>
获取变量的值为:“$变量名” ,如果是有特殊符号的变量要用双引号引起来。如$"user-traffic",不能写成少了双引号的 $user-traffic
一般变量名可以数字、大小写字母、下划线等,ros没有规定不能以数字开头,但推荐不要用数字和下划线开头,养成良好的编程习惯。
写变量名的时候值得注意的是:如果有特殊字符的变量名,需要用双引号括起来。大比如定义变量user-traffic,要写成 :global "user-traffic" xxx ,要用双引号把它引起来
因变量放在内存中,重启后所有定义的变量会消失。所以全局变量重启ros后也会消失。
2.2 用法
全局变量在什么时候才使用呢,一般是在需要跨脚本使用变量的时候。这样只需要在定义一个全局变量,其它脚本也可以使用此变量,比较方便。
但是使用全局变量的时候需要谨慎,如果没有没有规划好,很容易出问题,一般建议在一个脚本只定义一个全局变量,其它脚本只读的方式,尽量不做修改。使用全局变量最好限定在一个小业务功能脚本内,不要让它越界,按照约定起好名字,如:"模块名-作用-名字",也可以使用驼峰法,即第2个单词起,首字母大写。
2.3 例子
我创建一个名为var1的脚本并定义了一个全局变量名,主要是查看在线用户数,内容如下:
# 创建名为va1的脚本,内容如下:
# 获取在线用户数
:global userOnLineNum [/ppp active print count-only]
再创建一个名为var2的脚本,输出上面的全局变量,值得注意的是如果要使用另一个脚本定义的全局变量,还需要再定义一次才,var2脚本内容如下
# ros脚本不同于其它脚本,需要再次定义才可以调用
:global userOnLineNum
:put $userOnLineNum
运行va1再运行var2,效果如下:
[hua@MikroTik] > system script run var1
1
[hua@MikroTik] > system script run var2
1
二、局部变量
ros的local变量称本地变量,一般开发的喜欢称为局部变量。局部变量好理解,只能作到局部,使用关键词“:local ”定义。格式为:
:local <变量名> <值>
获取变量的值为:“$变量名”
2.1 用法
局部变量一般只是在某个脚本内生效,如果有大中小括号,那么它的作用范围将变成括号内,出了这个括号就失效了。
局部变量定义一般出现下面几个位置:
- 在脚本:只能脚本内生效,出了这个脚本就失效。
- 中括号内:只在[]内有效,出了[]将失效
- 花括号内:只在{}内有效,出现{}失效
注:在命令行中,只能使用全局变量
2.2 例子
例子:建立一个脚本为t1,输入下面内容
# 脚本内的变量,只在本脚本内生效
:local hello "ros"
# 2个字符串之间使用点号.连接
:put ($hello.",welcome")
# 局部变量在中括号[]内,超出中括号失效
[:local hello1 "() var";put $hello1]
# 失效,打印为空
:put $hello1
{:local hello2 "{} var";put $hello2}
# 失效,打印为空
:put $hello2
执行效果如下:
[hua@MikroTik] > system script run t1
ros,welcome
() var
() var
{} var
PS:上面的例子中,可以在大范围定义,小范围使用变量是没问题的,反过来则不行。比如上面的定义脚本变量
# 脚本内的变量,只在本脚本内生效 :local hello "ros" # 2个字符串之间使用点号.连接 :put ($hello.",welcome")
上面的 :put ($hello.",welcome") 可以放在在大中括号内使用。
# 变量在中括号中使用 [:put ($hello.",welcome")] # 变量在花括号中使用 {:put ($hello.",welcome")}