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

Variables Expect-如果未指定参数,则使用默认变量,variables,tcl,expect,Variables,Tcl,Expect,我已经搜索了stackoverflow,但还没有找到答案 我对脚本编写非常陌生,我已经创建了一个功能齐全的Expect脚本,但我想对它进行一些改进。目前,我已经为hostaddress、username和password创建了3个lindex值argv 0、1和2 如果未指定argv 1和argv 2,我希望创建默认用户名和密码。我试图通过一些if语句解决这个问题,但在通过stackoverflow进行搜索之后,TCL/Expect似乎不支持NULL或空值。相反,您必须对其进行查询。当前我的代码

我已经搜索了stackoverflow,但还没有找到答案

我对脚本编写非常陌生,我已经创建了一个功能齐全的Expect脚本,但我想对它进行一些改进。目前,我已经为hostaddress、username和password创建了3个lindex值argv 0、1和2

如果未指定argv 1和argv 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
proc parseArgv {hostAddress {user "TheDefaultUser"} {pass "TheDefaultPassword"}} {
    variable ::HOSTADDRESS $hostAddress
    variable ::USER $user
    variable ::PASSWORD $pass
}
parseArgv {*}$argv

如果argv 1或argv2中没有指定$USER和$PASSWORD,你们能帮我创建一个默认变量吗?

Tcl根本不支持NULL。或者更确切地说,它实际上将其映射到未设置的变量(这正是局部变量的情况;全局变量是不同的)。要查询变量是否存在,可以使用
info exists
(是的,在其实现中实际上是一个空检查)

但是,为了在命令行上处理来自用户的默认值,最好这样做:

#!/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
proc parseArgv {hostAddress {user "TheDefaultUser"} {pass "TheDefaultPassword"}} {
    variable ::HOSTADDRESS $hostAddress
    variable ::USER $user
    variable ::PASSWORD $pass
}
parseArgv {*}$argv
如果您使用的是8.4(升级,伙计!),那么将最后一行替换为:

eval parseArgv $argv

您也可以通过查看
$argv
llength
(或
$argc
中的值)并在此基础上执行条件操作来实现,但利用Tcl的
proc
默认参数值更容易(当有人给出的参数太少或太多时,您甚至会得到一个合理的错误).

非常感谢您的回复。我试着增加你的台词,但没有成功。代码现在看起来是这样的:'proc parseArgv{hostAddress{user“root”}{pass“password”}{variable::hostAddress$hostAddress variable::user$user variable::password$pass}parseArgv{}$argv spawn ssh$user@$hostAddress',但我得到了以下错误:'error#args:应该是“parseArgv hostAddress?user??pass?”在执行“parseArgv{}$argv”(文件“/expect.vpn.check.sh”第10行)时,是否需要更正某些内容?