从expect / tcl传递多个参数到perl脚本

时间:2013-01-08 09:33:54

标签: linux perl tcl expect

我在下面的剧本中遇到了一些麻烦。

proc checkUser {userip} {
    set search "show users | include "
    set search_cmd [concat $search $userip]
    exp_send "$search_cmd\r"

    expect {
        -re "Vi.*" {

            set oui "uei.opennms.org/services/passiveServiceStatus"
            set host "localhost"
            set iface "--interface $userip"
            set service "--service Test"
            set parm1 "--parm 'passiveNodeLabel [getNodeName $userip]'"
            set parm2 "--parm 'passiveIpAddr $userip'"
            set parm3 "--parm 'passiveServiceName Test'" 
            set parm4 "--parm 'passiveStatus Up'"

            send_user [ exec perl /opt/opennms/bin/send-event.pl $oui,$host,$iface,$service,$parm1,$parm2,$parm3,$parm4 ]
            #send_user [ exec [pwd]]

        }
    }
}

整个Expect脚本执行时没有错误,但是调用的perl脚本似乎没有执行,但是当我在bash中使用相同的参数运行perl脚本时,它会执行它所做的事情。

从Expect中调用perl脚本是否正确?

提前致谢。

1 个答案:

答案 0 :(得分:3)

编写的程序会将参数作为一个大参数传递给Perl脚本,并用逗号分隔。虽然这通常是合法的,但它可能不是Perl程序想要的!相反,在它们之间放置空格,以便值在Tcl级别是单独的参数,它们也将成为Perl级别的单独命令行参数:

exec perl /opt/opennms/bin/send-event.pl $oui $host $iface $service $parm1 $parm2 $parm3 $parm4

此外,您似乎每个Tcl变量都有多个参数,并且您尝试在其中使用shell引用。那是更加错误的。你编写这样的代码要好得多:

expect {
    -re "Vi.*" {
        set oui "uei.opennms.org/services/passiveServiceStatus"
        set host "localhost"

        send_user [ exec perl /opt/opennms/bin/send-event.pl $oui $host \
                --interface $userip \
                --service "Test" \
                --parm "passiveNodeLabel [getNodeName $userip]" \
                --parm "passiveIpAddr $userip" \
                --parm "passiveServiceName Test" \
                --parm "passiveStatus Up" ]
    }
}

每个参数字在Tcl中都是它自己的单词;为了让事情变得更清楚,我已经采用反斜杠换行了。我们使用双引号使它们在处理替换时可以有嵌入空格,但是如果你需要一些奇怪的东西,那么放入{大括号}或使用反斜杠。