如何在bash脚本中将参数传递给inline expect?

如何在bash脚本中将参数传递给inline expect?,bash,expect,Bash,Expect,我正在创建一个shell脚本来自动安装一个软件,该软件有自己的安装脚本,但我不想给用户提示。所以我用expect来回答这个脚本。现在我有以下几点: expect $package -c 'set timeout -1 set package [lindex $argv 0] spawn sh install_pipeline expect "Where should I install the software packages ? *" send "/usr/local/$package\r"

我正在创建一个shell脚本来自动安装一个软件,该软件有自己的安装脚本,但我不想给用户提示。所以我用expect来回答这个脚本。现在我有以下几点:

expect $package -c 'set timeout -1
set package [lindex $argv 0]
spawn sh install_pipeline
expect "Where should I install the software packages ? *"
send "/usr/local/$package\r"
expect "Where should I install the pipeline calibration files ? *"
send "/usr/local/$package\r"
expect eof'
其中package是一个变量,包含要安装的模块的名称。问题是,此脚本无法工作,并打印一条消息,说明:“Couldnt read file”包名:没有这样的文件或目录


如何将变量传递给expect脚本?我不想为expect创建单独的脚本以保持简单。

您的
expect
命令用单引号括起来。内部变量不能用shell展开

试试这个:

expect "$package" -c "set timeout -1
set package [lindex $argv 0]
spawn sh install_pipeline
expect \"Where should I install the software packages ? *\"
send \"/usr/local/$package\r\"
expect \"Where should I install the pipeline calibration files ? *\"
send \"/usr/local/$package\r\"
expect eof"
或者,如果您想保留单引号:

expect "$package" -c 'set timeout -1
set package [lindex $argv 0]
spawn sh install_pipeline
expect "Where should I install the software packages ? *"
send "/usr/local/'"$package"'\r"
expect "Where should I install the pipeline calibration files ? *"
send "/usr/local/'"$package"'\r"
expect eof'

根据Kenavoz的回答,我找到了解决方案。正如他所说,我的代码被简单的引号包围,因此expect无法从主脚本中获取变量。因此,仅使用普通引号解决了问题,而无需将变量作为参数传递:

expect -c "set timeout -1
spawn sh install_pipeline
expect \"Where should I install the software packages ? *\"
send \"/usr/local/$package\r\"
expect \"Where should I install the pipeline calibration files ? *\"
send \"/usr/local/$package\r\"
expect eof"

您可以通过以下环境传递它:

env pkg="$package" expect -c '
    set timeout -1
    spawn sh install_pipeline
    expect "Where should I install the software packages ? *"
    send "/usr/local/$env(pkg)\r"
    expect "Where should I install the pipeline calibration files ? *"
    send "/usr/local/$env(pkg)\r"
    expect eof
'

您最好双引号引用变量
“$package”
。将
“$package”
作为命令行参数传递给
expect
,然后使用
$argv
将其放入脚本中。如果不起作用,我仍然会收到相同的错误消息:“无法读取文件”hawki“:没有这样的文件或目录。您需要转义要保留的反斜杠:
\\r