如何避免Tcl字符串中的命令替换?

时间:2014-04-30 11:49:37

标签: string tcl expect

我正在尝试编写一个基于Tcl的expect脚本。 (实际上,我试图在python中生成expect脚本,不,我不能使用pyexpect)

如何发送没有特殊字符的字符串(如[)被解释为命令?

在bash shell中,我可以使用单引号来编写原始字符串。

$ echo 'hello $world'
hello $world

但是期待,我对特殊字符有很多问题。例如,括号被解释为命令。

expect1.1> send_user "[hello]"
invalid command name "hello"
    while executing
"hello"

我怎样才能打印字符串" [hello]"?

编辑:只是用花括号括起一个字符串并不总是有效。

例如

expect1.4> send_user {h} ello}

不打印字符串" h} ello"。它给出了一个错误:

extra characters after close-brace
    while executing
"send {h}ello}

根据文档,没有办法逃避大括号。

或者如果我想发送以*}开头的字符串怎么办? http://tcl.tk/man/tcl8.5/TclCmd/Tcl.htm#M10中的规则5会干扰并且无法逃脱*或}。

1 个答案:

答案 0 :(得分:3)

花括号会抑制所有膨胀*:

echo {hello $world}

你也可以逃避括号:

Echo "hello \$world"
  • 在解析语句时,大括号会禁止所有扩展。但是,某些命令可能会选择在内部进行自己的扩展。 if语句就是这样一个命令 - 即使花括号变量也会扩展。但是,没有多少命令具有此行为。

Tcl man page中记录了这一切。这是指花括号部分的链接:http://tcl.tk/man/tcl8.5/TclCmd/Tcl.htm#M10

您可能也对stackoverflow上的这个问题感兴趣:General string quoting for Tcl

请注意,大括号并不神奇 - 您仍然需要应用引用规则。例如,您不能使用不平衡的花括号等。您需要的精确引用机制将根据数据而有所不同。对于某些表示花括号的字符串,对于某些字符串表示引号,对于其他字符串,您可能需要反斜杠。对于其他人,您可能需要组合以及字符串连接。