知行合一
全部博文(31)
分类: 系统运维
2010-02-26 09:56:36
通道可以看作将一个连接,这个连接将一个通话连到asterisk PBX上。可以是到一个普通话机的连接,可以是连到普通电话线的连接,也可以是到一同逻辑通话的连接(如互联网电话)。Asterisk并不区分FXO和FXS通道(就是说,它不区分电话[telephones]和电话线[telephone lines])。每个通话(call)都会被加到一个通道中。
在asterisk的拨号方案中有两种级别的参数求值方法。
1.第一种,也是最常用的,就是用变量的值对其引用进行置换
2.然后就是下面的文章中会讨论到的,使用$[...]对表达式进行求值
l exten => s,5,Background,blabla
上面的参数blabla也可以被引号引起来("blabla")。在这个例子中,逗号并没有终止该字段,双引号会传给Background命令。变量替换的一些特殊字符,表达式求值等都可以被引号引起来。例如,为了在字符串"$1231"中使用$这个字符,可以使用\前缀加在$前面。下面的这些特殊字符必须使用引号引起来才能使用,它们是[]$"\。
这些双引号和转义字符在asterisk配置文件的级别上被解析,也就是说它们被asterisk的配置文件解析器来解析。
双引号也可以用在表达式里面,下面将讨论到。
变量字符串可以包含变量。变量名可以是任意的字符串。它们被存储在各自的通道结构(channel structure)中。
为了给变量赋上一个特定的值,可以使用下面的语句:
*
exten =>
1,2,Set(varname=value)
你可以在任意的位置使用${variablename}来替换变量值。例如,如果要将$lala添加在$blabla的后面连成的值存储在$koko中,可以这样做:
*
exten =>
1,2,Set(koko=${blabla}${lala})
有两种引用模式(reference modes) —— 值引用和名字引用。要使用变量的名字来进行引用,只需要写名字就好。而要引用该变量的值,则要使用${variablename}。例如,Set命令把第一个参数作为变量的名字:
* exten => 1,2,Set(koko=lala)
exten => 1,3,Set(${koko}=blabla)
上面的例子将变量"koko"和"lala"都赋值为"blabla"
如果在一个通道(channel)中用"_"作为一个变量的前缀对变量进行赋值,那么这个变量将被继承到在之后的和前一个channel相关的channel中。当继承后,在之后的channel中,前缀将被自动移除。如果以"__"作为前缀最变量进行赋值,那么除了会发生继承外,当继承后,前缀还保持有效。
在拨号方案中,对这些变量的引用(包括带前缀的和不带前缀的)都是对同一变量的引用。注意,如果对一种变量进行了赋值,那么将把之前的变量特性移除,譬如如果之前赋值了__variablename,之后又对其进行了variablename的赋值,那么这个变量保持的就是不带"__"变量的特性。
例子:
Set(__FOO=bar) ; 设置了FOO变量的继承版本
Set(FOO=bar) ; 移除了FOO变量的继承特性
从变量中挑选字符的格式可以表达如下:
* ${variable_name[:offset[:length]]}
如果你想要从变量字符串中挑选N个字符,仅仅需要在变量后便添加冒号和数字M,这样的话,将跳过变量的前M个字符,而选择后面的所有字符。
* ; 移除第一个字符,将之后的字符保存到number变量中。
exten => _9X.,1,Set(number=${EXTEN:1})
假设我们拨打918005551234,那么保存进number变量的值是18005551234。当我们需要用户拨打外线,但是不希望传第一个数字时,这种情况非常有用。
如果你用了一个负的偏移值,asterisk则从字符串的最后开始数起,然后选择之后的所有字符。下面的例子我们仍然假设拨打918005551234,将把数字1234存储在number变量中。
;将拨打号码最后四位的前面的数字全部移除
exten => _9X.,1,Set(number=${EXTEN:-4})
我们也可以限定选择的字符的数量。这只需要再添加一个冒号和一个长度值即可。下面的例子将555保存到变量number中。
; 只保存中间的555到变量number中
exten =>
_9X.,1,Set(number=${EXTEN:5:3})
长度值也可以和负的偏移值联合使用。当不知道字符串的长度,但是知道末尾的数字的时候,这种用法很有用。下面的例子中,即使字符串的开头的一些字符比我们想象的多,我们仍然能够把555保存到number变量中。
; Save the numbers 555 to the 'number' variable
exten =>
_9X.,1,Set(number=${EXTEN:-7:3})
如果使用了负的长度值,asterisk将从字符串后面移除这么长的字符数量。
; Set pin to everything but the trailing #.
exten =>
_XXXX#,1,Set(pin=${EXTEN:0:-1})
像这样格式的字符串$[….]是一个表达式,可以被用来求值。“表达式求值”同“变量替换”使用方式类似:表达式(包括方括号)被表达式求值的结果替代。 例子: exten => 1,1,Set(lala=$[1 + 2]) exten => 1,2,Set(koko=$[2 * ${lala}]) 变量koko的值被赋为6 下面的例子: exten => 1,1,Set,(lala=$[ 1 +
2 ]); 将按照之前的想法进行解析。多余的空格被忽略了。 如果求值的变量中包含空格,可能会产生问题。 对于这些情况,包含空格的字符串被引号引起来将把包含的文本强制解析成一个单独的标记。双引号将被当作标记的一部分。 例子: exten => s,6,GotoIf($[ "${CALLERID(name)}" :
"Privacy Manager" ]?callerid-liar,s,1:s,7) 变量CALLERID(name)可以被求值为”DELOREAN MOTORS”(带一个空格),但是上面的将被求值为”DELOREAN
MOTORS” : “Privacy Manager” 该值为0 如果上面的例子不带双引号,那么将被求为: DELOREAN MOTORS : Privacy Manager 并且将导致语法错误,因为标记DELOREAN被MOTORS跟着,表达式解析器不知道怎么求这种表达式,其不符合语法。 运算符(Operators) 下面的运算符以优先级递增的方式列在下面。同等优先级别的操作符被放在{}符号中。 如果expr1的值既不为空串也不为0,那么则返回expr1的值;否则,返回expr2的值 如果expr1表达式的值不为空也不为0则返回expr1的值;否则返回0 如果两个参数是数字的话,则返回浮点数比较的结果;否则返回使用本地描述对并排序方法得到的字符串比较的结果。如果指定的关系为真,则每次比较的结果是1,否则为0。 返回浮点参数相加,或相减的结果。 返回乘,浮点数相除,和参数求余的结果。 返回0减去expr1的结果。此运算符称为一元减法运算符,是右关联(right associative)的运算符,其同!运算符的优先级相同。 返回expr1的逻辑补码的结果。换句话说,如果expr1是null,0,空串,或串“0”,怎返回a 1。否则,返回a 0。它同一元减法运算符的优先级相同,也是有关联的。 :运算符使expr1同expr2进行匹配,expr2必须是正则表达式。而这个正则表达式需要使用隐式的’^’来锚定字符串的起始处(译者注:也就是说,expr2都是从开头匹配) 如果匹配成功并且模式中包含至少一个正则子表达式’…’,则相对于’\ 一般地,包含字符串的双引号被当作该字符串的一部分。这种情况对于:运算符是灾难性的。因此,在匹配进行前,双引号字符的开始和结尾会被从模式和字符串中被剔除。 大部分都和:运算符相同,唯一不同的是此运算符的匹配不是从字符串的开始处锚定。:和=~的优先级别是相同的。 传统的条件操作符。如果expr1求值为0(false),则返回expr3的结果。否则expr2被返回。如果expr1是一个字符串,并且求值是一个空串,或是两个字符“”,那么返回expr3。否则,返回expr2。在asterisk中,所有的这3个expr都会被求值;如果expr1为”true”,expr2被返回,否则返回expr3。这个操作符的优先级别最低。 联接操作符。这两个expr都会被求值,然后转化成字符串(剔除了双引号的),最后被合并成一个没有中间空格的字符串。这个操作符从表达式(Expressions)
变量值中的空格(Spaces Inside Variables Values)