我遇到了一个间歇性问题,星号会向来电者播放我们的问候,然后挂断电话而不是让我们的电话响铃。
我在这里的任何电话都无法重现该问题,而且许多来电者都可以正常接通。但是,有些来电者遇到了问题,我找不到任何模式。
我能找到的一些信息说它是由评估拨号计划表达式的错误引起的。我想这是这一行:
扩展 => START,n,GotoIf($[${FORCE_CLOSED}=TRUE]?CLOSED,1)
但我不确定它有什么问题。
我在控制台上看到以下错误:
[4 月 4 日 16:29:49] 警告 [27038]:ast_expr2.fl:459 ast_yyerror:ast_yyerror():语法错误:语法错误,意外的“=”,期待 $end;输入:=真^
周围控制台输出:
-- 在新堆栈中执行 [START@AGInbound:1] Answer("IAX2/AtlantaTeliax-10086", "")
-- 在新堆栈中执行 [START@AGInbound:2] BackGround("IAX2/AtlantaTeliax-10086", 0000_AG_THANK_YOU_FOR_CALLING_AG")
-- 播放“0000_AG_THANK_YOU_FOR_CALLING_AG.slin”(语言“en”)
[4 月 4 日 16:29:49] 警告 [27038]:ast_expr2.fl:459 ast_yyerror:ast_yyerror():语法错误:语法错误,意外的“=”,期待 $end;输入:
=真
^
[Apr 4 16:29:49] WARNING[27038]: ast_expr2.fl:463 ast_yyerror: 如果您有问题,请参考星号源中的 doc/tex/channelvariables.tex。
-- 在新堆栈中执行 [START@AGInbound:3] GotoIf("IAX2/AtlantaTeliax-10086", "?CLOSED,1")
-- 在新堆栈中执行 [START@AGInbound:4] GotoIfTime("IAX2/AtlantaTeliax-10086", "9:30-17:0|mon-fri|*|*?OPEN,1")
-- 在新堆栈中执行 [START@AGInbound:5] GotoIfTime("IAX2/AtlantaTeliax-10086", "10:0-18:30|sat|*|*?OPEN,1")
-- 在新堆栈中执行 [START@AGInbound:6] GotoIfTime("IAX2/AtlantaTeliax-10086", "12:0-17:0|sun|*|*?OPEN,1")
拨号计划中的相关线路:
扩展 => START,1,Answer()
扩展 => 开始,n,背景(0000_AG_THANK_YOU_FOR_CALLING_AG)
; 看看我们是否开放
; 如果无人接听,则强制关闭
扩展 => START,n,GotoIf($[${FORCE_CLOSED}=TRUE]?CLOSED,1)
扩展 => START,n,GotoIfTime(${AG_WEEKDAY_OPEN_HOUR}:${AG_WEEKDAY_OPEN_MIN}-${AG$
扩展 => START,n,GotoIfTime(${AG_SATURDAY_OPEN_HOUR}:${AG_SATURDAY_OPEN_MIN}-${$
扩展 => START,n,GotoIfTime(${AG_SUNDAY_OPEN_HOUR}:${AG_SUNDAY_OPEN_MIN}-${AG_S$
; ......我们不是。但也许一天中的时间已被覆盖?
扩展 => START,n,GotoIf($[${OVERRIDE_TIME_OF_DAY}=TRUE]?OPEN,1)
; 没有覆盖......我们绝对关闭。
扩展 => START,n,Goto(CLOSED,1)
知道表达有什么问题吗?我们最近从 1.4 升级到 1.6。
在星号$[]表达式中,未定义的变量不会返回隐式空字符串或零。它们在计算表达式之前扩展为“无”,因此在变量扩展(为无)之后,它对表达式解析器不可见。这会导致 Pablo Alsina 已经指出的错误:
GotoIf("IAX2/AtlantaTeliax-10086", "?CLOSED,1")
Run Code Online (Sandbox Code Playgroud)
有两种方法可以避免这种情况:
$[]表达式中,用双引号将变量和文字括起来。这将导致未定义的变量被视为空字符串,但仍可用于比较目的。就我个人而言,我尝试两者兼而有之。例如:
exten => START,n,Set(FORCE_CLOSED=FALSE)
exten => START,n,GotoIf($["${FORCE_CLOSED}"="TRUE"]?CLOSED,1)
Run Code Online (Sandbox Code Playgroud)
请注意周围的双引号${FORCE_CLOSED}和比较值。即使变量未定义,表达式也将有""(空字符串)与 进行比较"TRUE"。
实际上,您可以使用任何您喜欢的字符,因为它只会被附加到变量扩展上。它只是为您提供一个文字值,在变量未定义的情况下保证存在。我喜欢引号,因为它使代码类似于其他编程语言。您可以轻松地使用诸如 之类的东西$[x${FORCE_CLOSED}=xTRUE],这在 Bourne shell 脚本编写中很常见。最终结果是一样的。
| 归档时间: |
|
| 查看次数: |
11934 次 |
| 最近记录: |