如何在 bash 脚本中将参数传递给内联期望?
How to pass arguments to inline expect in a bash script?
我正在创建一个 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
'
我正在创建一个 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
'