如何在bash脚本中将参数传递给inline expect?
我正在创建一个shell脚本来自动安装一个软件,该软件有自己的安装脚本,但我不想给用户提示。所以我用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"
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