免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5668 | 回复: 8
打印 上一主题 下一主题

请问如何在expect脚本中实现变量比较? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-12 18:07 |只看该作者 |倒序浏览
现在有一脚本,是用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输出呀?
请各位不吝赐教,谢谢!

论坛徽章:
4
技术图书徽章
日期:2013-09-23 10:22:37狮子座
日期:2013-10-15 23:31:54卯兔
日期:2013-11-11 17:33:15金牛座
日期:2013-11-15 17:25:28
2 [报告]
发表于 2007-02-12 21:08 |只看该作者
expect里的if else这样用
if { $var1 > 28} {
blah blah
} else {
blah blah
}

论坛徽章:
0
3 [报告]
发表于 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

论坛徽章:
0
4 [报告]
发表于 2007-02-13 15:41 |只看该作者
那个 var1 是在远端系统上的变数值.
你又没把值取给 expect
他当然是回你 no such variable!

建议你直接在远端上写好 shell 呼叫判断就好了
虽然 expect 也是可以取值做判断, 但没必要愈搞愈复杂吧.

论坛徽章:
0
5 [报告]
发表于 2007-02-13 22:30 |只看该作者
楼上的老大
能不能给个具体例子关于"建议你直接在远端上写好 shell 呼叫判断"或 "expect 也是可以取值做判断"啊?
谢谢啦

论坛徽章:
0
6 [报告]
发表于 2007-02-13 22:51 |只看该作者
不太了解你想做什么事情.
你既然会用到 expect 去登入远端执行某些指令了
这些动作及流程应该都是固定的了,
你只要在远端主机把这些流程控制及动作脚本先写好
在 expect 上只要做登入及执行脚本的动作就好了呀 = =?
这样不是比较单纯.

还是你想在 expect 上做流程控制有什么特别的用意

论坛徽章:
0
7 [报告]
发表于 2007-02-14 12:23 |只看该作者
他想做坏事,呵呵

论坛徽章:
0
8 [报告]
发表于 2007-02-15 09:13 |只看该作者
原帖由 vantien 于 2007-2-13 22:51 发表
不太了解你想做什么事情.
你既然会用到 expect 去登入远端执行某些指令了
这些动作及流程应该都是固定的了,
你只要在远端主机把这些流程控制及动作脚本先写好
在 expect 上只要做登入及执行脚本的动作就好了 ...


我也知道如果是把脚本放在远端机器上,那是很容易解决的.但问题就是不能在远端机器放脚本
难道关于这个问题实在是没有办法解决了吗?
春节快到了,先预祝各位新春大吉

论坛徽章:
0
9 [报告]
发表于 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 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP