4

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
'

expect如果使用shebang调用,它的工作方式类似于

#!/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

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

我尝试过声明和导出命令行参数变量,并将上面第一个示例中的 $1、$2、$3 分别更改为声明和导出的变量名,这在我拥有的另一个脚本中有效,我实际上在其中声明了变量脚本......不同之处在于它们不是命令行参数。

host=$1
export host
hostusername=$2
export hostusername
hostpassword=$3
export hostpassword

以及只是导出它们

export host
export hostusername
export hostpassword

并尝试上面的第一个示例。没有变化,expect继续索赔

无法读取“X”:没有这样的变量

在另一个 bash 脚本中,我能够通过 BOTH 声明变量然后像上面的示例中那样导出它们来成功导出变量。但是我无法通过将bash命令行参数变量传递给expect

4

1 回答 1

6

带有嵌套引号的代码不容易编写和阅读。我推荐你使用 shell 的here-document语法。例如(演示 2 种将bashvars 传递给的方法expect):

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

expect << END
puts $arg1
puts \$env(arg2)
END
$ bash foo.sh hello world
hello
world
$

我更喜欢export var从 shell 中引用它,并$env(var)在 expect 中引用它,因为您不必担心其中是否var有一些特殊字符(如'"空格)。

于 2013-03-14T14:25:08.400 回答