我有以下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]行替换为脚本运行的实际值,是否有人知道错误是什么。
提前致谢。
答案 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脚本中获取参数。