我在stackoverflow上搜索过,并没有真正找到答案。
我是脚本新手,我已经创建了一个功能齐全的Expect脚本,但我想稍微改进一下。目前我已经为hostaddress,username和password创建了3个lindex值argv 0,1和2。
如果未指定argv 1和2,我想创建默认用户名和密码。我尝试通过一些if语句解决这个问题,但在搜索stackoverflow之后,似乎TCL / Expect不支持NULL或空值。相反,你必须对它进行查询。目前我的代码如下所示:
#!/usr/bin/expect
#Variables
set HOSTADDRESS [lindex $argv 0]
set USER [lindex $argv 1]
set PASSWORD [lindex $argv 2]
spawn ssh $USER@$HOSTADDRESS
set timeout 100
expect {
"(yes/no)?" {send "yes\n"; exp_continue}
"assword:" {send "$PASSWORD\n"}
}
expect {
"%" {send "cli\r"; exp_continue}
">" {sleep 1}
}
send "show interfaces st0 terse | match st0. | count \r"
expect "Count:???"
puts [open $HOSTADDRESS.op5.vpn.results w] $expect_out(0,string)
expect ">"
send "exit\r"
expect {
"%" {send "exit\r"; exp_continue}
"closed." {exit}
}
exit
如果没有在argv 1或argv2中指定,你们可以帮我为$ USER和$ PASSWORD创建一个默认变量吗?
答案 0 :(得分:1)
Tcl根本不支持NULL。或者更确切地说,实际将它映射到未设置的变量(这正是引擎盖下的局部变量所发生的事情;全局变量是不同的)。要查询变量是否存在,可以使用info exists
(是的,实际上它实际上是一个NULL检查)。
但是,要在命令行上处理来自用户的值的默认值,最好这样做:
proc parseArgv {hostAddress {user "TheDefaultUser"} {pass "TheDefaultPassword"}} {
variable ::HOSTADDRESS $hostAddress
variable ::USER $user
variable ::PASSWORD $pass
}
parseArgv {*}$argv
如果您使用的是8.4(升级,man!),请将最后一行替换为:
eval parseArgv $argv
你也可以通过查看llength
的{{1}}(或$argv
中的值)并根据它来做有条件的事情,但利用Tcl的$argc
默认参数值的东西更容易(当有人提供的参数太少或太多时,你甚至会得到一个合理的错误。)