我正在使用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
感谢阅读!
答案 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。