我正在编写一个bash脚本,其中许多其他东西用于期望自动运行二进制文件并通过回答安装程序提示来安装它。
当使用命令“expect $ expectedcriptname $ Parameter”在我的bash脚本中调用expect脚本时,我能够使我的expect脚本正常工作。但是,我想将expect脚本嵌入到shell脚本中,而不是为作业维护两个单独的脚本文件。我四处搜索,发现将expect嵌入到bash脚本中的过程是在下面声明一个像VAR这样的变量,然后回显它。:
VAR=$(expect -c "
#content of expect script here
")
echo "$VAR"
1)我不明白回声$ VAR实际上是如何运行期望脚本的。谁能解释一下?
2)我不确定如何将$ Parameter传递给VAR或echo语句。这是我的主要关注点。
有什么想法吗?感谢。
答案 0 :(得分:2)
在 bash 中,构造$(cmd)
运行指定的命令并捕获其输出。它与反引号符号类似,但有一些细微差别。因此,VAR的赋值运行 expect 命令:
# expect is run here
VAR=$(expect -c "
# ...
")
# This echoes the output of the expect command.
echo "$VAR"
从 bash 手册页:
当旧式的反引号形式 使用替换,反斜杠 保留其字面意义除外 当后跟$,
, or \. The first backquote not preceded by a backslash terminates the command substitution. When using the
$(命令)`表格,所有字符 括号之间弥补了 命令;没有人受到特别对待。
这就是为什么它的工作原理:本的bash 注释字符(#)不被视为内的注释字符的$( ... )
修改强>
传递参数:只需将它们放在那里。例如,请考虑以下脚本:
foo="Hello, there"
bar=$(echo "
# $foo
")
echo $bar
如果您运行该脚本,则会打印:
# Hello, there
因此,$foo
的值在引号内被替换。这同样适用于expect
脚本。
答案 1 :(得分:2)
尝试类似:
#!/bin/sh
tclsh <<EOF
puts $1
EOF
我今天没有安装expect命令,所以我使用了tclsh。
答案 2 :(得分:1)
您是否考虑过只编写一个期望脚本而不是bash脚本和期望脚本?
期望是Tcl的超集,这意味着它是一个功能完备的编程语言,你可以用它来做任何你可以用bash做的事情(对于你不能做的事情,你总是可以执行bash命令你不必使用期望只是为了“期待”事情