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

Shell expect script:将ls命令的输出设置为变量,shell,unix,expect,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 但我不知道如何在expect脚本中实现这一点。我搜索的其他示例似乎是将send的输出设置为一个变量——这就是路径吗 谢谢你的帮助 将已发送

我不熟悉shell脚本编写和使用不同的脚本语言

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

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

echo $var

for x in $var;
# do stuff 
done
但我不知道如何在expect脚本中实现这一点。我搜索的其他示例似乎是将
send
的输出设置为一个变量——这就是路径吗


谢谢你的帮助

将已发送命令的输出捕获到expect变量实际上是一个PITA。捕获的输出包含命令和提示:假设您的提示是
“>”
,并且您发送了
日期
命令。我们将看到:

"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
    将匹配您发送的命令(直到第一个换行符)--这是
    日期\r\n
  • (.*)\r\n
    是命令的输出(直到最后一行结束)
    • expect将捕获的文本存储在变量
      expect\u out(1,字符串)
  • $
    是匹配提示的地方
因此,您的计划将是:

#!/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

将已发送命令的输出捕获到expect变量实际上是一个PITA。捕获的输出包含命令和提示:假设您的提示是
“>”
,并且您发送了
日期
命令。我们将看到:

"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
    将匹配您发送的命令(直到第一个换行符)--这是
    日期\r\n
  • (.*)\r\n
    是命令的输出(直到最后一行结束)
    • expect将捕获的文本存储在变量
      expect\u out(1,字符串)
  • $
    是匹配提示的地方
因此,您的计划将是:

#!/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

它说:无法读取“expect_out(1,string)”:没有这样的变量提示是否以美元符号和空格结尾?如果没有,则必须调整该正则表达式。它说:无法读取“expect_out(1,string)”:没有此类变量提示是否以美元符号和空格结尾?如果不是,则必须调整该正则表达式。