Expect - 如果未指定参数,则使用默认变量

时间:2014-06-08 06:26:07

标签: variables tcl expect

我在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创建一个默认变量吗?

1 个答案:

答案 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默认参数值的东西更容易(当有人提供的参数太少或太多时,你甚至会得到一个合理的错误。)