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})