我是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
的输出设置为变量 - 这是路由吗?
感谢您的帮助。
答案 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_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