Expect中应该转义哪些字符,以及如何转义?

时间:2014-05-09 08:53:57

标签: bash expect

我正在使用expect来自动化脚本。这是我的剧本:

setup_multicraft=$(expect -c "

set timeout 10
spawn ./setup.sh

expect \"Run each Minecraft server under its own user? (Multicraft will create system users): \\\[y\\\]/n\"
send \"y\r\"

供参考,以下是一些原始脚本:

Run each Minecraft server under its own user? (Multicraft will create system users): [y]/n
Run Multicraft under this user: [minecraft]
User not found. Create user 'minecraft' on start of installation? [y]/n

我知道像括号,斜线和有时点这样的字符需要进行转义才能使其正常工作。但是我在字符上尝试了几种转义序列组合,每次都会出现此错误:

invalid command name "y\"
    while executing
"y\\"
    invoked from within
"expect "Run each Minecraft server under its own user? (Multicraft will create system users): \\[y\\]/n""
spawn ./setup.sh

感谢阅读!

1 个答案:

答案 0 :(得分:2)

你在shell中用双引号字符串声明你的期望脚本的方式是你痛苦的主要来源。如果您不依赖于插入 shell 变量,则可以使用单引号here-doc:

setup_multicraft=$(expect <<'END_OF_EXPECT'

    set timeout 10
    spawn ./setup.sh

    expect {Run each Minecraft server under its own user? (Multicraft will create system users): [y]/n}
    send "y\r"

    # ...
END_OF_EXPECT
)

更整洁,不是吗?

在Tcl(和expect)中,命令替换在方括号中完成(相当于shell反引号),因此如果要在双引号字符串中使用括号,则需要对它们进行转义。

在Tcl中,您可以使用花括号来防止变量扩展和命令替换(相当于shell单引号)。我在这里证明了这一点。

描述了Tcl的整个语法here。您可以快速浏览Tcl tutorial