如何将bash数组传递给expect

时间:2016-03-09 03:25:08

标签: expect

我有一个shell脚本,它将数组变量传递给expect。但是,在期望部分,它只需要第一个参数,并说'#34;无法读取文件--server:没有这样的文件或目录"

下面是示例程序: -

在这里,我想要${CMPREQUEST_ARGS[@]}的完整值 cmpclient --ir --server 10.10.10.10 --port 4040

CMPREQUEST=($CMPCLIENT "${CMPREQUEST_ARGS[@]}")

echo "TEST:${CMPREQUEST[@]}:TEST"   //echo prints the value of ${CMPREQUEST[@]} correctly.

expect -c "
log_file -noappend -a \"/srv/Log/log/cmpclient-$app_id.log\"
log_user 1
set RET_VAL 1
set timeout 86400

puts "TEST2:${CMPREQUEST[@]}:TEST2"  

spawn \${CMPREQUEST[@]}
expect {
  -re \"SUCCESS\:\ write\ X509\" {
      set RET_VAL 0
  }
  timeout { set RET_VAL 1 }
}
exit \$RET_VAL
"
exit $?

我在spawn中遇到此错误 无法读取文件--server:没有这样的文件或目录

请指导..非常感谢任何帮助。

提前致谢!

1 个答案:

答案 0 :(得分:0)

这归结为引用地狱。使用shell here-doc来保存期望代码,然后您不需要转义所有“内部”引号。您的主要问题是spawn命令,您要阻止shell扩展数组。

试试这个:

expect <<END_EXPECT
    log_file -noappend -a /srv/Log/log/cmpclient-$app_id.log
    log_user 1
    set RET_VAL 1
    set timeout 86400

    puts "TEST2:${CMPREQUEST[@]}:TEST2"  

    spawn ${CMPREQUEST[@]}
    expect {
        -re {SUCCESS: write X509} {
            set RET_VAL 0
        }
        timeout { set RET_VAL 1 }
    }
    exit \$RET_VAL
END_EXPECT

只需要保护期望变量RET_VAL不受shell保护。