期待脚本错误$ argv未找到

时间:2014-09-16 23:56:12

标签: shell expect

我有以下shell(/ expect)脚本。

#!/bin/bash
expect -c '
set user [lindex $argv 0]
set password [lindex $argv 1]
set ipaddr [lindex $argv 2]
set timeout 10
spawn ssh $user@$ipaddr mkdir -p ~/Tested
expect "*?assword:*"
send -- "$password\r"
interact
'

当我按如下方式运行脚本时

. test.sh abcd test 10.xx.xxx.xxx

它出现以下错误

can't read "argv": no such variable
    while executing
"lindex $argv 0"
    invoked from within
"set user [lindex $argv 0]"

如果我将[lindex $ argv 0]行替换为脚本运行的实际值,是否有人知道错误是什么。

提前致谢。

1 个答案:

答案 0 :(得分:2)

-c 中的expect标记提供了一种 执行命令行而不是脚本中指定的命令的方式。

通常,-c为标志用于命令行,用于在脚本获得控制权之前执行命令。

它们的用法如下。

expect -c "set debug 1" myscript.exp

在myscript.exp中,您可以检查此变量的值:

if [info exists debug] {
 puts "debugging mode: on"
}
else {
 set debug 0
 # imagine more commands here
 if $debug {puts "value of x = $x"}
}

运行脚本时,它会通过评估info exists来检查是否定义了调试 Tcl命令,如果定义了变量,则返回1,否则返回0。如果定义了, 然后,脚本可以稍后测试它以确定它是否应该打印脚本内部的调试信息。 else子句将debug设置为0,以便以后可以使用简单的if $debug测试。

现在,让我们来回答您的问题。您正在使用变量argv这是传递给某个脚本的命令行参数列表并且正在使用-c标志,您无法使用它,因为argv旨在用于内部一个脚本,而不是外面的。

您可以将代码置于脚本文件中,并按以下方式调用代码,而不是这样做。

expect yourscript.exp username pwd ip_address

如果您仍然对命令行参数感兴趣,那么您可以尝试fwilson在评论中建议的内容。

expect yourscript.exp $1 $2 $3

有了这个,yourscript.exp将从shell脚本中获取参数。

参考:Exploring Expect