expect script:将ls命令的输出设置为变量

时间:2016-11-15 15:43:59

标签: shell unix expect

我是shell脚本和导航不同脚本语言的新手。

我正在编写一个expect脚本,我希望将ssh ls命令的输出设置为循环的变量,如下面的bash脚本

#!/bin/bash
var=$(ssh user@host ls path | grep 'keyword')

echo $var

for x in $var;
# do stuff 
done

但我不确定如何在期望脚本中执行此操作。我搜索的其他示例似乎是将send的输出设置为变量 - 这是路由吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

将发送命令的输出捕获到expect变量实际上是PITA。捕获的输出包含命令和提示:假设您的提示为"> ",并且您发送date命令。期待会看到这个:

"date\r\nTue Nov 15 11:34:16 EST 2016\r\n> "

所以你需要这样做才能捕获输出:

send -- "date\r"
expect -re {^[^\n]+\n(.*)\r\n> $}
set output $expect_out(1,string)

在那种复杂的模式中:

  • ^[^\n]+\n将匹配您发送的命令(直到第一个换行符) - 这是date\r\n
  • (.*)\r\n是命令的输出(直到最后一行结尾)
    • expect会将捕获的文本存储在变量expect_out(1,string)
  • > $与您的提示相符。

所以你的计划将是:

#!/usr/bin/env expect
spawn ssh user@host
expect -re {\$ $}      ;# regular expression to match your prompt

send -- "ls path | grep keyword\r"
expect -re {^[^\n]+\n(.*)\r\n$ $}
set output $expect_out(1,string)

send -- "exit\r"
expect eof

puts $output