如何将子期望脚本中的值返回到父sh脚本

时间:2013-05-30 10:00:52

标签: shell unix expect

我在shell脚本中有一个expect脚本。我的问题是我无法从子期望脚本获取变量值到shell父脚本。

请在下面找到我的代码:

#!/bin/sh

expect <<- DONE
spawn telnet myemailserver.com imap
expect "* OK The Microsoft Exchange IMAP4 service is ready."

send "a1 LOGIN myuser mypass\r"
expect "a1 OK LOGIN completed."

send "a2 EXAMINE INBOX\r"
expect "a2 OK EXAMINE completed."

send "a3 SEARCH UNSEEN\r"
expect "a3 OK SEARCH completed."
set results $expect_out(buffer)
set list [split $results "\n"]

send "a4 LOGOUT\r"
expect "Connection closed by foreign host."

spawn echo $list

expect eof
DONE

echo $list
exit 0

我发现最后一行的变量列表是空的。有没有办法将值从变量$ list传递给shell父脚本?

1 个答案:

答案 0 :(得分:1)

你的here-document需要shell变量扩展才能将脚本提供给expect解释器。 $list变量没有替换(假设您的程序中没有名为list的shell变量)。您需要确保here-doc是单引号(如下所示)

就像使用awk或sed一样,shell进程间通信是通过沿标准IO通道传递数据来执行的:shell脚本必须捕获expect程序的输出:

list=$( expect <<'END'
    log_user 0         
    # expect program here
    puts $list
END
)
echo $list

由于我使用log_user 0抑制产生程序的正常终端输出以便仅将关键信息发送回shell,因此必须使用expect spawn echo命令替换puts