日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

hualinux ros 1.13:RouterOS脚本(三):命令行结构

發(fā)布時(shí)間:2024/3/26 linux 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hualinux ros 1.13:RouterOS脚本(三):命令行结构 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

一、命令行語法

1.1?命令行語法

1.2?關(guān)于大中小括號(hào)解說

1.2.1?小括號(hào):一個(gè)整體

1.2.2?中括號(hào):子命令

1.2.3?花括號(hào):語句塊

二、注解:方便你我

2.1?注解說明

2.2?例子

三、行連接:提升閱讀性

四、指令之間的空格

4.1?說明

4.2?例子

五、變量的作用域

5.1?什么是變量

5.2?變量為分類

5.2.1?全局變量

5.2.2?局部變量

六、關(guān)鍵詞

七、分隔符


本章開始講ros的腳本語法,主要是根據(jù)ros wiki文檔腳本部分進(jìn)行講解。

本章講ros的基礎(chǔ)語法,命令行結(jié)構(gòu)。后面幾章講解ros腳本的都是基于《RouterOS腳本實(shí)驗(yàn)實(shí)例pppoe配置》基礎(chǔ)上進(jìn)行講解的

一、命令行語法

1.1?命令行語法

RouterOS控制臺(tái)是使用下面的命令語法:

[前綴] [路徑] 命令 [未命名參數(shù)] [參數(shù)=[值]] .. [參數(shù)=[值]]
  • ?[前綴 ] – 如果命令是ICE或者路徑通過":”或者"”字符表示[路徑]–得到操作菜單的路徑
  • ?[路徑 ] – 得到操作菜單的路徑?
  • ?命令 – 一個(gè)命令獲取在指定的菜單路徑下?
  • ?[未命名參數(shù)] – 即事先定義參數(shù) ,如果命令需要必須指該即事先定義參數(shù)?
  • ?[參數(shù) ] – 按先后順序各自定義值 按先后順序各自定義值

命令行結(jié)束符為“;”,它也可以代表換行。在結(jié)束命令行有時(shí)不需要“;”

或者換行獨(dú)立的命令包含 (), [] 或者 {}不需要任何的結(jié)尾命令字符,命令結(jié)尾取決于腳本的內(nèi)容

ps:如果你不確定除了大小小括號(hào)外命令行是否加分號(hào)結(jié)束符,最好還是加上。

1.2?關(guān)于大中小括號(hào)解說

上面沒有對(duì)大小括號(hào)進(jìn)行講解對(duì)于沒有接觸過開發(fā)的初學(xué)者會(huì)有點(diǎn)懵,所以有必須講一下

1.2.1?小括號(hào):一個(gè)整體

小括代表是一個(gè)整體。那它具體用在哪里呢

  • 優(yōu)先級(jí)。當(dāng)有幾個(gè)操作的時(shí)候,會(huì)涉及到優(yōu)先級(jí),可能需要幾個(gè)低優(yōu)先級(jí)的結(jié)果再進(jìn)行運(yùn)算,這樣低優(yōu)先級(jí)的需要用小括號(hào)。運(yùn)行符優(yōu)先級(jí)將在后面講,也可以自己搜索一下其它語言的優(yōu)先級(jí)。如java語言運(yùn)算符優(yōu)先級(jí),大部分是相同的,學(xué)完可以測試一下。ros運(yùn)行符并不像java那樣豐富,畢竟是腳本語言。

如:2+3的結(jié)果現(xiàn)乘以6,我們小學(xué)的時(shí)候就知道要用小括號(hào)括起來,在程序中就優(yōu)先級(jí)問題,你可以寫成“(2+3)*6”,但是你把小括號(hào)去掉那就有問題了 2+3*5變成了17而不是我們想要的30

  • 易讀性。當(dāng)有幾個(gè)操作雖然不加小括號(hào),優(yōu)先級(jí)沒有變化,但是不方便閱讀啊!

如:k = (j>i) && (8==i);?你完全可以寫成 “k = j>i && 8==i;",但是這樣方便閱讀嗎,別人還要特意運(yùn)行一下看是不是和自己理解一樣,有時(shí)還要查一下優(yōu)先級(jí)表!影響他人的工作效率。

1.2.2?中括號(hào):子命令

中括號(hào)表達(dá)里填寫的是ros命令,中括號(hào)會(huì)返回執(zhí)行命令結(jié)果,這樣就可以把結(jié)果變參數(shù)的值。

比如要在pppoe的在線用戶名,查名為p11用戶在線時(shí)長

分析:

查在線用戶可以在ppp active

要查某個(gè)字段,可以使用get,但是get必須要指定項(xiàng)目號(hào)。如果直接填寫項(xiàng)目號(hào)不妥,因?yàn)轫?xiàng)目號(hào)是變的,所以要結(jié)合find命令,find命令剛才能找到項(xiàng)目號(hào),具體命令如下:

[hua@MikroTik] > :put [ppp active get number=[ find where name=p11] value-name=uptime] 00:43:15

上面中“:put”表示輸出,?number=[ find where name=p11] value-name=uptime 的意思是把find找到的結(jié)果項(xiàng)目號(hào)賦值給get的number參數(shù)

注:中括號(hào)命令可以寫相對(duì)路徑,也可以寫絕對(duì)路徑,上面的就是相對(duì)路徑,和前面的命令是同等級(jí),這里前面的命令是get,所以get的上一級(jí)命令下所有都是同等的,可以直接使用。

1.2.3?花括號(hào):語句塊

當(dāng)我們要的結(jié)果一個(gè)命令執(zhí)行不了,需要多個(gè)命令才行,那么我們就要用花括號(hào)括起來,還有條件和循環(huán)語句,后面將會(huì)講解。

比如:如果找到p11用戶,則把上網(wǎng)時(shí)間,發(fā)到計(jì)費(fèi)平臺(tái)上(實(shí)際操作中可以直接用freeradius的數(shù)據(jù)庫中查,推薦使用mysql),

如果發(fā)送可以使用fetch命令,我這里就不用了,使用打印“發(fā)送平臺(tái)成功”來表示

如果用winbox創(chuàng)建腳本并寫下代碼,如下:

代碼如下:?

# 獲取p11用戶在線時(shí)間,并賦值給本地變量userUptime # 當(dāng)一條命令太長的時(shí)候,可以使用 "\"行連接符 :local userUptime [/ppp active get number=\[find where name=p11] value-name=uptime]# 如果變量的值大于0,則判斷用戶存在,可以用fetch把用戶時(shí)間的值提以get或post方式交到平臺(tái) # 在這里我簡單一點(diǎn)直接選擇打印 # 如果變量為空,即不是大于0,則表示用戶沒有找到 :if ($userUptime>0) do={:put $userUptime:put "sucess" } else={:put "user not foud!" }

可以使用如下命令查看運(yùn)行結(jié)果:

[hua@MikroTik] > system script run sendUserUptime 02:39:25 sucess

二、注解:方便你我

2.1?注解說明

一個(gè)注釋從“#”號(hào)字符開始執(zhí)行,并結(jié)束在一行的結(jié)尾,空格或者任何其他標(biāo)示不允許在#標(biāo)示之前。如果“#”字符出現(xiàn)在一個(gè)字符串中將不會(huì)考慮為一個(gè)注釋內(nèi)容。

為什么要用到注解,當(dāng)我們寫腳本代碼或開發(fā)的時(shí)候,適當(dāng)?shù)亟o代碼添加注解可以方便理解,如果共同開發(fā)的話,其他人閱讀你的代碼也會(huì)提高理解

PS:一般項(xiàng)目都要求寫項(xiàng)目說明文檔,在小公司中經(jīng)常趕項(xiàng)目,也有不少人的項(xiàng)目不會(huì)寫項(xiàng)目文檔,尤其是幾任換下來,新來的沒有項(xiàng)目說明文檔只能看源代碼,如果源代碼寫得很亂,一點(diǎn)說注解說明都沒有,那是一件很痛苦的事。

所以養(yǎng)好寫注解、寫項(xiàng)目說明文檔的好習(xí)慣吧^_^

2.2?例子

例子我就不說了,上面最前面有#號(hào)的就是,#號(hào)一般是放在行首的,最前面。

# 1.判斷用戶是否存在 :if ($userUptime>0) do={# 2.前面有空格,不推薦的注解:put $userUptime # 3.行末,不推薦的注解位置:put "sucess" } else={:put "user not foud!" }

第2和第3種注解是不推薦的,在我的ros6.47中這個(gè)注解也是沒有問題的,其實(shí)為在編程中我喜歡用直接在代碼對(duì)應(yīng)的頂部進(jìn)行注解,跟著代碼的縮進(jìn)而縮進(jìn)

三、行連接:提升閱讀性

當(dāng)我們寫一個(gè)ros命令的時(shí)候,這個(gè)命令很長,為了提高閱讀性,美觀,我們會(huì)建議適當(dāng)?shù)匕汛a分行,那分了行怎么告訴ros我這個(gè)是同一行的呢?那就要用到行連接符,這里使用的是 "\"

比如我在前面寫的

:local userUptime [/ppp active get number=\[find where name=p11] value-name=uptime]

PS:請(qǐng)記住一句:代碼的可閱讀性很重要!

當(dāng)然生產(chǎn)環(huán)境的代碼為了節(jié)約空間可以不美化,使用壓縮。比如jquery分開發(fā)版本和生產(chǎn)環(huán)境版本,開發(fā)版就是美化的,文件會(huì)大一點(diǎn),而開發(fā)版是壓縮的,把空格換行注解等能去掉的都全部去掉!

四、指令之間的空格

4.1?說明

空格可以用于分隔指令。僅當(dāng)兩個(gè)指令挨一起會(huì)產(chǎn)生另一個(gè)意思或誤解,需要空格把它隔開。

還有一部分是固定不充許有空格的

  • 在 '< 參數(shù) >=' >=' >=' >=' 之間不允許
  • 在 'from=' 'to=' 'step=' 'in=' 'do=' 'else='這間不充許

4.2?例子

比如搞一個(gè)活動(dòng),給一些體驗(yàn)賬號(hào),前一個(gè)小時(shí)上網(wǎng)是免費(fèi)的,當(dāng)我們計(jì)費(fèi)的時(shí)候就要判斷用戶在小且時(shí)長超過1小時(shí)才計(jì)費(fèi)。

比如$IsUserOnline為用戶是否在線,$userUptime為時(shí)長,為了方便測試我直接給變量賦值了,代碼如下

:local IsUserOnline "true" :local userUptime "01:02:00" :if ($IsUserOnline=true&&$userUptime>"00:60:00")\do={ :put "ok" } else={ :put "less than 1 hours" }

執(zhí)行結(jié)果如下:

# 這個(gè)是用戶存在,時(shí)間為1小時(shí)2分的 [hua@MikroTik] > system script run t1 ok # 我把userUptime 改為"00:32:00",再次執(zhí)行效果 [hua@MikroTik] > system script run t1 less than 1 hours

這樣寫沒什么毛病,如果if部分用and寫變成"$IsUserOnline=true and $userUptime>"00:60:00"?這樣也沒問題,但是如果and前后沒有空格那就有問題了,意思完全不同

變成這樣"$IsUserOnline=trueand$userUptime>"00:60:00"? ,在ros中沒有報(bào)錯(cuò),這樣會(huì)產(chǎn)生誤解啊,會(huì)變成是“$IsUserOnline=trueand”也不方便閱讀

五、變量的作用域

5.1?什么是變量

在ros中可以粗暴理解為,把一些命令執(zhí)行的結(jié)果及數(shù)據(jù)(如字符串、數(shù)字、IP地址等等)放在一個(gè)內(nèi)存的“房間”中,這個(gè)“房間”就是來存各種ros數(shù)據(jù)。我們把這樣的房間起個(gè)專業(yè)的名詞叫變量。

PS:更專業(yè)的理解可以自行搜索一下。

內(nèi)存中可以有很多變量,變量一般分為全局變量和局部變量

5.2?變量為分類

按作用域,即就是作用范圍,可以分全局變量和局部變量。

值得注意的是變量是放在內(nèi)存中的,除了系統(tǒng)釋放和自己寫的命釋放外,重啟、斷電、關(guān)機(jī)再開都會(huì)導(dǎo)致變量消失。

5.2.1?全局變量

全局變量即是這個(gè)變量在整個(gè)ros中都可以使用。就相當(dāng)于我們的公交車那樣,大家都可以坐。

全局變量多使用可以跨腳本使用、因?yàn)榇蠹叶伎梢允褂?#xff0c;個(gè)個(gè)都可以修改,所以使用全局變量時(shí)要很注意,如果腳本很多,改來改來,結(jié)果都不知道哪個(gè)腳本修改了。最后是人為的強(qiáng)制指定只有在特定的情況下才能使用

定義變量的格式為:

:global <變量名> <值>

獲取變量的值為:“$變量名”

例子:在統(tǒng)計(jì)中如果在線用戶數(shù),很多個(gè)腳本在使用的話,那么可以把它設(shè)置為全局變量,這樣這些腳本都可以使用了。

:global onlineNum [/ppp active print count-only]

執(zhí)行效果:

# 一般寫在腳本中,我這里方便就直接使用命令行去執(zhí)行 [hua@MikroTik] > :global onlineNum [/ppp active print count-only] 1 [hua@MikroTik] > :put $onlineNum 1

5.2.2?局部變量

局部變量好理解,只能作到局部,使用關(guān)鍵詞“:local ”定義。格式為:

:local <變量名> <值>

局部變量一般出現(xiàn)下面幾個(gè)位置

  • 在腳本:只能腳本內(nèi)生效,出了這個(gè)腳本就失效。
  • 中括號(hào)內(nèi):只在[]內(nèi)有效,出了[]將失效
  • 花括號(hào)內(nèi):只在{}內(nèi)有效,出現(xiàn){}失效

注:在命令行中,只能使用全局變量

例子:建立一個(gè)腳本為t1,輸入下面內(nèi)容

# 腳本內(nèi)的變量,只在本腳本內(nèi)生效 :local hello "ros" # 2個(gè)字符串之間使用點(diǎn)號(hào).連接 :put ($hello.",welcome")# 局部變量在中括號(hào)[]內(nèi),超出中括號(hào)失效 [:local hello1 "() var";put $hello1] # 失效,打印為空 :put $hello1{:local hello2 "{} var";put $hello2} # 失效,打印為空 :put $hello2

執(zhí)行效果如下:

[hua@MikroTik] > system script run t1 ros,welcome () var () var {} var

六、關(guān)鍵詞

所謂的關(guān)鍵詞就是ros系統(tǒng)指定有特殊含的詞不能用作變量。比如 and(與)、or(或)、in(在...里)等等,這些都是有特殊含義的。

七、分隔符

下面記號(hào)作為分隔符的語法:

() [] {} : ; $ /

PS:什么是分隔符這就不用講了吧,就是能起分隔作用的符號(hào)

總結(jié)

以上是生活随笔為你收集整理的hualinux ros 1.13:RouterOS脚本(三):命令行结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。