Asterisk權威指南/第十章 深入撥號計劃


10. 1表達式和變量操作

編輯

由於我們開始深入的研究 Dialplan,是時間向你介紹幾個可以極大增強你操作 Dialplan 能力的工具。這些設計可以通過你定義的不同條件來做出決定,從而給你的 dialplan 增加難 以置信的智能處理能力。戴上你的思考帽,讓我們開始。

10.1.1 基本表達式

編輯

表達式是變量(variables),操作符(operators),和值(values)的組合,你把它們串 在一起,並產生一個結果。一個表達式可以測試一個數值,修改一個字符串,或者執行一個 數學計算。讓我們假設我們有一個變量稱為 COUNT。用通俗語言描述,表達式可以是「COUNT 加 1」和「COUNT 除以 2」。每個這樣的表達式都可以根據輸入變量的值得到一個特定的結 果或值。在 Asterisk 中,表達式總是開始於「$」符號並緊跟着一個方括號,如下所示:  $[expression]  這樣,我們可以寫兩個例子如下:  $[${COUNT} + 1] $[${COUNT} / 2]  當 Asterisk 在 Dialplan 中遇到表達式時,它會將整個表達式替換為結果值。需要重點注意的 是,值替換是發生在變量替換之後。為了說明這一點,讓我們看下面的代碼注 1:  exten => 321,1,Set(COUNT=3) same => n,Set(NEWCOUNT=$[${COUNT} + 1]) same => n,SayNumber(${NEWCOUNT})  在第一步(the first priority),我們給變量 COUNT 賦值為 3。  第二步(the second priority),只有一個應用(application)——Set()——被調用,但實際上 發生了三件事:  1. Asterisk 將表達式中的${COUNT}替換為數值 3,表達式等效為:  exten => 321,n,Set(NEWCOUNT=$[3 + 1])  2. Asterisk 計算這個表達式,把 1 加到3 上,並用計算結果 4 替換:  3. 利用 Set()給變量 NEWCOUNT 賦值為 4  第三步簡單調用 SayNumber(),用來念出變量${NEWCOUNT}的當前值。  請將這個例子在你的 dialplan 上試一下。 

10.1.2 操作符(Operators)

編輯

當你創建一個 Asterisk 的 Dialplan 時,你實際上是在用一種專門的腳本語言編程。這意 味着 Asterisk dialplan——像任何編程語言一樣——能夠識別被稱為操作符(operators)的符 號並允許你操作變量(variables)。讓我們看一下 Asterisk 中可用操作符的類型: 

布爾操作符(Boolean operators)  這類操作符判斷語句的「真實性」。在計算機術語中,這實際上是指這個語句是什麼還 是不是什麼(非零或零,真或假,開或關,等等)。布爾操作符是:  expr1 | expr2  這個操作符(稱為「或」操作符,或者「管道」)當 expr1 為真時(不是空字符串 也不是零)返回 expr1 的值。否則,它返回 expr2 的值。   expr1 & expr2  這個操作符(稱為「與」)當兩個表達式都為真時(例如,沒有一個表達式的值是 空字符串或者零)返回 expr1 的值。否則,它返回零。   expr1 {=, >, >=, <, <=, !=} expr2  這些表達式返回整數比較結果如果兩個參數都是整數;否則,它們返回字符串比較 結果。如果兩個參數的關係為真的話,返回值為 1;如果兩個參數的關係為假則返 回值為 0。(如果你執行字符串比較,將採用與你的操作系統本地設置一致的方法。)

 

算術操作符(Mathematical operators)   希望執行一個計算?你將需要下述操作符之一:   expr1 {+, -} expr2   這些操作符返回整數值參數加或減運算的結果。   expr1 {*, /, %} expr2   這些操作符分別返回整數值參數相乘,整除,或者求余運算的結果。 

 

正則表達式操作符(Regular expression operator)   你也可以在 Asterisk 中使用正則表達式操作符:   expr1 : expr2  這個操作符匹配 expr1 和 expr2,其中 expr2 必須是正則表達式注2。這個正則表達 式固定以一個隱含的 ^ 開始注3。  如果匹配成功並且 expr2 中至少包含一個正則子表達式——\(…\)——則返回與\1 關聯的字符串;否則,匹配操作符返回匹配的字符個數。如果匹配失敗並且 expr2 中包含一個正則子表達式,則返回空(null)字符串;否則,返回 0。 

 

在 Asterisk 1.0 版本中的語法分析程序非常簡單,所以它需要你在操作符與任何其它值之間 至少放一個空格。因此,下面的表達式可能並不會像你期待的那樣工作:  exten => 123,1,Set(TEST=$[2+1])  這個表達式將給 TEST 賦值為字符串「2+1」,而不是值 3。為了糾正這個錯誤,我們需要在 操作符兩邊放上空格,像這樣:  exten => 234,1,Set(TEST=$[2 + 1])  不過這種做法在當前版本的 Asterisk 中不再需要,因為現在的詞法分析程序已經提供了足夠 的容錯處理能力。然而,出於加強可讀性的目的,我們仍舊推薦在操作符周圍增加空格。 


如果需要將文本附加到一個變量的開始或結尾,只要簡單的把它們放在一起就可以了,像這 樣:  exten => 234,1,Set(NEWTEST=blah${TEST}) 

10.2 Dialplan 函數(Functions)

編輯

10.2.1 語法(Syntax)

編輯

10.2.2 Dialplan 函數舉例

編輯

10.3 條件跳轉(Conditional Branching)

編輯

10.3.1 The GotoIf() Application

編輯

10.3.2 基於時間的條件跳轉 GotoIfTime()

編輯