Chinaunix

标题: 请问如何在expect脚本中实现变量比较? [打印本页]

作者: JAMESBONE    时间: 2007-02-12 18:07
标题: 请问如何在expect脚本中实现变量比较?
现在有一脚本,是用expect登陆到一主机上.
需要根据var1的值来决定不同的输出
#!/usr/bin/expect
spawn /usr/bin/telnet 10.123.123.123
expect "login:"
send "gmcc\r"
expect "word:"
send "abcdef\r"
expect "@"   
send "var1=`输入命令`\r "   <---给var1赋值,假设var1被赋值30
expect "@"  
send "echo \$var1 \r "     <---var1值为30
if [ "$var1" -gt "28" ]    <---脚本在这里不正常了,报错是can't read "var1":no such variable,
then                                   应该是由于var1是在远程机器上的变量
echo "greater than 28"
else
echo "less than 28"
fi
interact

那应该如何根据var1的值实现不同的echo输出呀?
请各位不吝赐教,谢谢!
作者: nbrr    时间: 2007-02-12 21:08
expect里的if else这样用
if { $var1 > 28} {
blah blah
} else {
blah blah
}
作者: JAMESBONE    时间: 2007-02-12 21:48
不行啊,仍然是当比较var1的值时报错,是不是我理解有误啊
#!/usr/bin/expect
spawn /usr/bin/telnet 10.123.123.123
expect "login:"
send "gmcc\r"
expect "word:"
send "abcdef\r"
expect "@"   
send "var1=`输入命令`\r "   <---给var1赋值,假设var1被赋值30
expect "@"  
send "echo \$var1 \r "     <---var1值为30
if { $var1 > 28}              <---仍然报错是can't read "var1":no such variable!
{
echo...
}                                   
else
{
echo...
}
interact
作者: vantien    时间: 2007-02-13 15:41
那个 var1 是在远端系统上的变数值.
你又没把值取给 expect
他当然是回你 no such variable!

建议你直接在远端上写好 shell 呼叫判断就好了
虽然 expect 也是可以取值做判断, 但没必要愈搞愈复杂吧.
作者: JAMESBONE    时间: 2007-02-13 22:30
楼上的老大
能不能给个具体例子关于"建议你直接在远端上写好 shell 呼叫判断"或 "expect 也是可以取值做判断"啊?
谢谢啦
作者: vantien    时间: 2007-02-13 22:51
不太了解你想做什么事情.
你既然会用到 expect 去登入远端执行某些指令了
这些动作及流程应该都是固定的了,
你只要在远端主机把这些流程控制及动作脚本先写好
在 expect 上只要做登入及执行脚本的动作就好了呀 = =?
这样不是比较单纯.

还是你想在 expect 上做流程控制有什么特别的用意
作者: linux_gao    时间: 2007-02-14 12:23
他想做坏事,呵呵
作者: JAMESBONE    时间: 2007-02-15 09:13
原帖由 vantien 于 2007-2-13 22:51 发表
不太了解你想做什么事情.
你既然会用到 expect 去登入远端执行某些指令了
这些动作及流程应该都是固定的了,
你只要在远端主机把这些流程控制及动作脚本先写好
在 expect 上只要做登入及执行脚本的动作就好了 ...


我也知道如果是把脚本放在远端机器上,那是很容易解决的.但问题就是不能在远端机器放脚本
难道关于这个问题实在是没有办法解决了吗?
春节快到了,先预祝各位新春大吉
作者: vantien    时间: 2007-02-15 16:30
为什么会不能放脚本?

你想在 expect 中用的话.
网路上还是有很多文章在介绍呀
只是你自己需要去调测一下
不过我是觉得没什么必要那么麻烦.
真的想弄就去看看 tcl 跟 expect 的文件吧.

----

決定如何響應

管理員往往有這樣的需求,希望根據當前的具體情況來以不同的方式對一個命令進行響
應。我們可以通過後面的例子看到expect可以實現非常複雜的條件響應,而僅僅通過簡
單的修改預處理腳本就可以實現。下面的例子是一個更複雜的expect-send例子:

expect -re "\[(.*)]:"
if {$expect_out(1,string)!="/bin/tcsh"} {
send "/bin/tcsh" }
send " "
expect eof

在這個例子中,第一個expect命令現在使用了-re參數,這個參數表示指定的的字符串是
一個正則表達式,而不是一個普通的字符串。對於上面這個例子裡是查找一個左方括號字
符(其必須進行三次逃逸(escape),因此有三個符號,因為它對於expect和正則表達時來
說都是特殊字符)後面跟有零個或多個字符,最後是一個右方括號字符。這裡.*表示表示
一個或多個任意字符,將其存放在()中是因為將匹配結果存放在一個變量中以實現隨後的
對匹配結果的訪問。

当发现一个匹配则检查包含在[]中的字符串,查看是否为/bin/tcsh。如果不是则发送
/bin/tcsh给chsh命令作为输入,如果是则仅仅发送一个回车符。这个简单的针对具体情
况发出不同相响应的小例子说明了expect的强大功能。

在一个正则表达时中,可以在()中包含若干个部分并通过expect_out数组访问它们。各
个部分在表达式中从左到右进行编码,从1开始(0包含有整个匹配输出)。()可能会出现
嵌套情况,这这种情况下编码从最内层到最外层来进行的。

----

[ 本帖最后由 vantien 于 2007-2-15 16:37 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2