用于出口bash命令行参数的变量在嵌入式期待(Export Bash command-line-ar

2019-08-17 13:56发布

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家当,它就像

#!/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脚本,我能够双方宣布它们,然后把它们导出在上面的例子中顺利出口变量。 但我一直没能有任何这样的运气与合格bash命令行参数变量,以expect

Answer 1:

与嵌套引号的代码是不容易的写入和读取。 我建议你使用shell的这里文档语法。 例如(demo'ing 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
$

我宁愿export var从壳中引用, $env(var)在期望的那样,你会不会担心如果var有一些特殊字符(如'"或空格)在里面。



文章来源: Export Bash command-line-argument variables for use in embedded Expect