2

我在 shell 脚本中有一个期望脚本。我的问题是我无法从子期望脚本到 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 父脚本?

4

1 回答 1

1

在将脚本提供给期望解释器之前,您的 here-document 会受到 shell 变量扩展的影响。该$list变量被任何内容替换(假设您的程序中还没有名为 list 的 shell 变量)。您需要确保 here-doc 是单引号的(如下所示)

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

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

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

于 2013-05-30T10:41:19.220 回答