【问题标题】:Expect - Use default variable if no argument is specifiedExpect - 如果未指定参数,则使用默认变量
【发布时间】:2014-06-08 06:26:06
【问题描述】:

我在 stackoverflow 上进行了搜索,但还没有真正找到答案。

我对脚本很陌生,我已经创建了一个功能齐全的 Expect 脚本,但我想对其进行一些改进。目前,我为主机地址、用户名和密码创建了 3 个 argv 0、1 和 2 的 lindex 值。

如果未指定 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 创建一个默认变量?

【问题讨论】:

    标签: variables tcl expect


    【解决方案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(升级,伙计!),请将最后一行替换为:

    eval parseArgv $argv
    

    您也可以通过查看$argvllength(或$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 ' 但我收到以下错误:'wrong # args: should be "parseArgv hostAddress ?user??pass?"在执行 "parseArgv {}$argv" (file "./expect.vpn.check.sh" line 10) ' 有什么需要纠正的吗?
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 2017-09-11
    • 2022-11-14
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2017-07-12
    相关资源
    最近更新 更多