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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

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

目錄

一、命令行語法

1.1?命令行語法

1.2?關于大中小括號解說

1.2.1?小括號:一個整體

1.2.2?中括號:子命令

1.2.3?花括號:語句塊

二、注解:方便你我

2.1?注解說明

2.2?例子

三、行連接:提升閱讀性

四、指令之間的空格

4.1?說明

4.2?例子

五、變量的作用域

5.1?什么是變量

5.2?變量為分類

5.2.1?全局變量

5.2.2?局部變量

六、關鍵詞

七、分隔符


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

本章講ros的基礎語法,命令行結構。后面幾章講解ros腳本的都是基于《RouterOS腳本實驗實例pppoe配置》基礎上進行講解的

一、命令行語法

1.1?命令行語法

RouterOS控制臺是使用下面的命令語法:

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

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

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

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

1.2?關于大中小括號解說

上面沒有對大小括號進行講解對于沒有接觸過開發的初學者會有點懵,所以有必須講一下

1.2.1?小括號:一個整體

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

  • 優先級。當有幾個操作的時候,會涉及到優先級,可能需要幾個低優先級的結果再進行運算,這樣低優先級的需要用小括號。運行符優先級將在后面講,也可以自己搜索一下其它語言的優先級。如java語言運算符優先級,大部分是相同的,學完可以測試一下。ros運行符并不像java那樣豐富,畢竟是腳本語言。

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

  • 易讀性。當有幾個操作雖然不加小括號,優先級沒有變化,但是不方便閱讀啊!

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

1.2.2?中括號:子命令

中括號表達里填寫的是ros命令,中括號會返回執行命令結果,這樣就可以把結果變參數的值。

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

分析:

查在線用戶可以在ppp active

要查某個字段,可以使用get,但是get必須要指定項目號。如果直接填寫項目號不妥,因為項目號是變的,所以要結合find命令,find命令剛才能找到項目號,具體命令如下:

[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找到的結果項目號賦值給get的number參數

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

1.2.3?花括號:語句塊

當我們要的結果一個命令執行不了,需要多個命令才行,那么我們就要用花括號括起來,還有條件和循環語句,后面將會講解。

比如:如果找到p11用戶,則把上網時間,發到計費平臺上(實際操作中可以直接用freeradius的數據庫中查,推薦使用mysql),

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

如果用winbox創建腳本并寫下代碼,如下:

代碼如下:?

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

可以使用如下命令查看運行結果:

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

二、注解:方便你我

2.1?注解說明

一個注釋從“#”號字符開始執行,并結束在一行的結尾,空格或者任何其他標示不允許在#標示之前。如果“#”字符出現在一個字符串中將不會考慮為一個注釋內容。

為什么要用到注解,當我們寫腳本代碼或開發的時候,適當地給代碼添加注解可以方便理解,如果共同開發的話,其他人閱讀你的代碼也會提高理解

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

所以養好寫注解、寫項目說明文檔的好習慣吧^_^

2.2?例子

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

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

第2和第3種注解是不推薦的,在我的ros6.47中這個注解也是沒有問題的,其實為在編程中我喜歡用直接在代碼對應的頂部進行注解,跟著代碼的縮進而縮進

三、行連接:提升閱讀性

當我們寫一個ros命令的時候,這個命令很長,為了提高閱讀性,美觀,我們會建議適當地把代碼分行,那分了行怎么告訴ros我這個是同一行的呢?那就要用到行連接符,這里使用的是 "\"

比如我在前面寫的

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

PS:請記住一句:代碼的可閱讀性很重要!

當然生產環境的代碼為了節約空間可以不美化,使用壓縮。比如jquery分開發版本和生產環境版本,開發版就是美化的,文件會大一點,而開發版是壓縮的,把空格換行注解等能去掉的都全部去掉!

四、指令之間的空格

4.1?說明

空格可以用于分隔指令。僅當兩個指令挨一起會產生另一個意思或誤解,需要空格把它隔開。

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

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

4.2?例子

比如搞一個活動,給一些體驗賬號,前一個小時上網是免費的,當我們計費的時候就要判斷用戶在小且時長超過1小時才計費。

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

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

執行結果如下:

# 這個是用戶存在,時間為1小時2分的 [hua@MikroTik] > system script run t1 ok # 我把userUptime 改為"00:32:00",再次執行效果 [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中沒有報錯,這樣會產生誤解啊,會變成是“$IsUserOnline=trueand”也不方便閱讀

五、變量的作用域

5.1?什么是變量

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

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

內存中可以有很多變量,變量一般分為全局變量和局部變量

5.2?變量為分類

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

值得注意的是變量是放在內存中的,除了系統釋放和自己寫的命釋放外,重啟、斷電、關機再開都會導致變量消失。

5.2.1?全局變量

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

全局變量多使用可以跨腳本使用、因為大家都可以使用,個個都可以修改,所以使用全局變量時要很注意,如果腳本很多,改來改來,結果都不知道哪個腳本修改了。最后是人為的強制指定只有在特定的情況下才能使用

定義變量的格式為:

:global <變量名> <值>

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

例子:在統計中如果在線用戶數,很多個腳本在使用的話,那么可以把它設置為全局變量,這樣這些腳本都可以使用了。

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

執行效果:

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

5.2.2?局部變量

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

:local <變量名> <值>

局部變量一般出現下面幾個位置

  • 在腳本:只能腳本內生效,出了這個腳本就失效。
  • 中括號內:只在[]內有效,出了[]將失效
  • 花括號內:只在{}內有效,出現{}失效

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

例子:建立一個腳本為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

六、關鍵詞

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

七、分隔符

下面記號作為分隔符的語法:

() [] {} : ; $ /

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。