【问题标题】:How do I embed an expect script that takes in arguments into a bash shell script?如何将接收参数的期望脚本嵌入到 bash shell 脚本中?
【发布时间】:2011-06-01 14:06:57
【问题描述】:

我正在编写一个 bash 脚本,其中包括许多其他用途,期望自动运行二进制文件并通过回答安装程序提示来安装它。

当使用命令“expect $expectscriptname $Parameter”在我的 bash 脚本中调用期望脚本时,我能够让我的期望脚本正常工作。但是,我想将期望脚本嵌入到 shell 脚本中,而不必为作业维护两个单独的脚本文件。我四处搜索,发现将expect嵌入bash脚本的过程是在下面声明一个类似VAR的变量,然后回显它。:

VAR=$(expect -c "
#content of expect script here
")
echo "$VAR"

1) 我不明白回显 $VAR 如何实际运行期望脚本。谁能解释一下?
2) 我不确定如何将 $Parameter 传递给 VAR 或 echo 语句。这是我主要关心的问题。

有什么想法吗?谢谢。

【问题讨论】:

    标签: bash shell arguments embed expect


    【解决方案1】:

    尝试类似:

    #!/bin/sh
    
    tclsh <<EOF
    puts $1
    EOF
    

    我今天没有安装 expect 命令,所以我改用了 tclsh。

    【讨论】:

      【解决方案2】:

      bash 中,构造 $(cmd) 运行指定的命令并捕获其输出。它类似于反引号表示法,但有一些细微差别。因此,对 VAR 的 assignment 是运行 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 $(command)` 形式时,所有字符 括号之间组成 命令;没有人受到特殊对待。

      这就是它起作用的原因:bash 注释字符 (#) 不被视为 $( ... ) 中的注释字符。

      编辑

      传递参数:只要把它们放在那里。例如,考虑这个脚本:

      foo="Hello, there"
      bar=$(echo "
      # $foo
      ")
      echo $bar
      

      如果您运行该脚本,它会打印:

      # Hello, there
      

      因此,$foo 的值被替换在引号内。 expect 脚本也应如此。

      【讨论】:

      • 好的。不知道这种反引号表示法的替代方法。
      • 谢谢。关于从 shell 传递参数到期望的任何想法?
      【解决方案3】:

      您是否考虑过只编写一个expect 脚本而不是bash 脚本和expect 脚本?

      Expect 是 Tcl 的超集,这意味着它是一种功能齐全的编程语言,你可以用它做任何你可以用 bash 做的事情(对于你不能做的事情,你总是可以执行 bash 命令. 你不必仅仅为了“期待”事物而使用expect

      【讨论】:

        猜你喜欢
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-28
        • 1970-01-01
        • 2019-05-01
        • 1970-01-01
        • 2010-11-21
        相关资源
        最近更新 更多