导出Bash命令行参数变量以在嵌入式Expect中使用

Try*_*ain 3 variables bash expect command-line-arguments

echo测试表明了我的命令行变量的工作,但我如何通过它们,它们导出,在嵌入式中使用expect

#!/bin/bash

echo name of script is $0
echo host is $1
echo hostusername is $2
echo hostpassword is $3

expect -c 'spawn ssh -l $2 $1 < ./sf-wall_scp_bash.sh
sleep 2

expect {
"(yes/no)? " {send "yes\n"}
    exp_continue
}

expect {
"?assword" {send "$3\r"}
}
sleep 1
'
Run Code Online (Sandbox Code Playgroud)

如果用expectshebang 调用,它就像

#!/usr/bin/expect

set host [lindex $argv 0]
set hostusername [lindex $argv 1]
set hostpassword [lindex $argv 2]


spawn ssh -l $hostusername $host
sleep 2

expect {
"(yes/no)? " {send "yes\n"}
    exp_continue
}

expect {
"?assword" {send "$hostpassword\r"}
}
sleep 1
Run Code Online (Sandbox Code Playgroud)

......按预期工作.我需要使用bash但嵌入,expect因为脚本需要调用bash特定的命令,函数,内置变量...否则只是使用第二个例子将是一个工作选项,但事实并非如此.

我已经尝试声明并导出命令行参数变量,并将上面第一个示例中的$ 1,$ 2,$ 3分别更改为声明和导出的变量名称,这适用于我实际上在其中声明变量的另一个脚本脚本......区别在于它们不是命令行参数.

host=$1
export host
hostusername=$2
export hostusername
hostpassword=$3
export hostpassword
Run Code Online (Sandbox Code Playgroud)

以及只是出口它们

export host
export hostusername
export hostpassword
Run Code Online (Sandbox Code Playgroud)

并尝试上面的第一个例子.没有变化,expect继续声称

不能读"X":没有这样的变数

在另一个bash脚本中,我能够通过BOTH声明它们然后导出它们来成功导出变量,如上例所示.但是我没有能够将bash命令行参数变量传递给expect

pyn*_*exj 5

嵌套引号的代码不易编写和读取.我建议你使用shell的here-document语法.例如(演示2种传递bash变量的方式expect):

$ cat foo.sh
arg1=$1
export arg2=$2

expect << END
puts $arg1
puts \$env(arg2)
END
$ bash foo.sh hello world
hello
world
$
Run Code Online (Sandbox Code Playgroud)

我更喜欢export varshell并且引用它$env(var)预期,因为你不必担心它是否var有一些特殊的字符(如',"或空格).