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()[编辑]