6

我遇到了一个期望脚本的问题。我想捕获命令的输出何时为“0”并与“000”或“100”等其他数字或链区分开来

我的代码是:

#!/usr/bin/expect -f
set timeout 3
spawn bash send "echo 0\n" 
expect {
-regexp {^0$} { send_user "\nzero\n" }  
-re {\d+} { send_user "\number\n"}
}
send "exit\n"

我有以下回应:

spawn bash
echo 0

number

但以下正则表达式不起作用:

-regexp {^0$} { send_user "\nzero\n" }

如果我将其更改为:

-regexp {0} { send_user "\nzero\n" }

有效,但它也捕获“00”“10”“1000”等。

send "echo 100\n"
expect {
    -regexp {0} { send_user "\nzero\n" }
    -re {\d+} { send_user "\nnumber\n"}
}

结果:

spawn bash
echo 10

zero

我不知道我做错了什么,也没有从谷歌的帮助中找到任何帮助。我还搜索了此处解决的类似问题,但我无法使其在我的代码上运行。

更新

我尝试了建议的修复代码:

#!/usr/bin/expect -f
set timeout 3
spawn bash
send "echo 0\n"
expect {
    -regexp {\b0\b} { send_user "\nzero\n" }
    -re {\d+} { send_user "\nnumber\n"}
}
send "exit\n"

但我仍然有这样的回应:

spawn bash
echo 0

number

更新 2

我也试过这条线:

 -regexp {"^0\n$"} { send_user "\nzero\n" }

但我仍然有相同的结果。

提前致谢

4

3 回答 3

5

我可以解决这个问题:

#!/usr/bin/expect -f
set timeout 3

spawn bash
send "echo 0\n"
expect -re "(\\d+)" {
    set result $expect_out(1,string)
}
if { $result == 0 } {
    send_user "\nzero\n";
} else {
    send_user "\nnumber\n";
}

send "exit\n"
于 2013-08-14T13:49:02.210 回答
0

快速浏览了期望的文档:

但是,因为 expect 不是面向行的,所以这些字符匹配当前在 expect 匹配缓冲区中的数据的开头和结尾(与行相反)。

您的正则表达式应该考虑到您有换行符这一事实。

如果你的数据是0\n,那么你可以使用"^0\n$".

于 2013-08-13T13:53:22.680 回答
-1

尝试使用单词边界:\b0\b

于 2013-08-13T12:50:09.693 回答