2016-11-15 116 views
0

我是新来的shell脚本和浏览不同的脚本语言。预计脚本:ls命令的输出设置为变量

我正在写一个expect脚本,我想一个SSH ls命令的输出设置为变量,通过循环,就像下面的bash脚本

#!/bin/bash 
var=$(ssh [email protected] ls path | grep 'keyword') 

echo $var 

for x in $var; 
# do stuff 
done 

但我不知道如何在预期脚本中执行此操作。我搜索的其他例子似乎将send的输出设置为变量 - 这是路线吗?

感谢您的帮助。

回答

0

捕捉发送的命令的输出到一个期望变量实际上是一个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是命令的输出(直到最后升INE结尾)
    • 预计将捕获的文本存储在变量expect_out(1,string)
  • > $是您匹配您的提示。

所以你的程序是:

#!/usr/bin/env expect 
spawn ssh [email protected] 
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 
+0

它说:无法读取“expect_out(1串)”:没有这样的变量 – chungkim271

+0

请问您提示最终以一个美元符号和空间?如果不是,则必须调整该正则表达式。 –