AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 129491
Accepted
Nick
Nick
Asked: 2010-04-05 13:10:35 +0800 CST2010-04-05 13:10:35 +0800 CST 2010-04-05 13:10:35 +0800 CST

星号:使用“ast_yyerror”挂断电话

  • 772

我遇到了一个间歇性问题,星号会向来电者播放我们的问候语,然后挂断电话而不是让我们的电话响铃。

我在这里的任何电话都无法重现该问题,而且许多呼叫者都可以正常接通。但是,有些呼叫者遇到了问题,我找不到任何模式。

我能找到的一些信息说它是由评估拨号计划表达式的错误引起的。我想是这条线:

exten => START,n,GotoIf($[${FORCE_CLOSED}=TRUE]?CLOSED,1)

但我不确定它有什么问题。

我在控制台上看到以下错误:

[Apr 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”)
[Apr 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")

拨号计划中的相关线路:

扩展 => 开始,1,答案()
扩展 => 开始,n,背景(0000_AG_THANK_YOU_FOR_CALLING_AG)

; 看看我们是否开放
; 如果没有人会回答,则强制关闭
exten => START,n,GotoIf($[${FORCE_CLOSED}=TRUE]?CLOSED,1)

exten => START,n,GotoIfTime(${AG_WEEKDAY_OPEN_HOUR}:${AG_WEEKDAY_OPEN_MIN}-${AG$
exten => START,n,GotoIfTime(${AG_SATURDAY_OPEN_HOUR}:${AG_SATURDAY_OPEN_MIN}-${$
exten => START,n,GotoIfTime(${AG_SUNDAY_OPEN_HOUR}:${AG_SUNDAY_OPEN_MIN}-${AG_S$
; ......我们不是。但也许一天中的时间已被覆盖?
exten => START,n,GotoIf($[${OVERRIDE_TIME_OF_DAY}=TRUE]?OPEN,1)
; 没有覆盖......我们肯定会关闭。
扩展 => 开始,n,转到(关闭,1)

知道表达式有什么问题吗?我们最近从 1.4 升级到 1.6。

asterisk
  • 3 3 个回答
  • 12747 Views

3 个回答

  • Voted
  1. Best Answer
    James Sneeringer
    2010-04-08T13:08:26+08:002010-04-08T13:08:26+08:00

    在 Asterisk$[]表达式中,未定义的变量不返回隐式空字符串或零。它们在评估表达式之前扩展为“无”,因此在变量扩展(无)之后,表达式解析器将看不到它。这会导致 Pablo Alsina 已经指出的错误:

    GotoIf("IAX2/AtlantaTeliax-10086", "?CLOSED,1")
    

    有两种方法可以避免这种情况:

    1. 在使用变量之前,请始终为变量提供合理的默认值(如 Pablo 建议的那样)。
    2. 在任何$[]表达式中,用双引号将变量和文字括起来。这将导致未定义的变量作为空字符串处理,该字符串仍可用于比较目的。

    就个人而言,我尝试两者都做。例如:

    exten => START,n,Set(FORCE_CLOSED=FALSE)
    exten => START,n,GotoIf($["${FORCE_CLOSED}"="TRUE"]?CLOSED,1)
    

    注意周围的双引号${FORCE_CLOSED}和比较值。即使变量未定义,表达式也会有""(一个空字符串)来比较"TRUE"。

    真的,你可以使用任何你喜欢的字符,因为它只会被附加到变量扩展上。它只是为您提供一个保证在变量未定义的情况下存在的文字值。我喜欢引号,因为它使代码类似于其他编程语言。您可以轻松地使用类似 的东西$[x${FORCE_CLOSED}=xTRUE],这在 Bourne shell 脚本中很常见。最终结果是一样的。

    • 2
  2. bmargulies
    2010-04-05T14:09:32+08:002010-04-05T14:09:32+08:00

    这是我可以告诉你的。

    yyerror 是来自 yacc 生成的解析器的错误。

    该错误抱怨=。所以看起来,在那一行,= 是语法不支持的结构。

    祝你在这个问题所在的 serverfault.com 上好运......

    • 0
  3. Pablo Alsina
    2010-04-08T11:26:20+08:002010-04-08T11:26:20+08:00

    谁定义了 ${FORCE_CLOSED}?

    从我所见,似乎该变量有时没有获得初始值,然后在您评估时解析器引发并出错

    GotoIf("IAX2/AtlantaTeliax-10086", "?CLOSED,1")
    

    检查引发错误的调用是否具有合理的 FORCE_CLOSED 值

    • 0

相关问题

  • 我应该使用 Asterisk GUI 吗?

  • Asterisk/TrixBox 和预测拨号/外呼呼叫中心

  • 有稳定的跨平台软电话吗?还是只有 Linux 的?

  • 我们可以在我们的 MAXIMISER 4140 呼叫服务器上使用 Slicecomm PCS100 运行 Asterisk 吗?

  • 通过星号 PBX 在 IP 电话上使用 Google 联系人

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve