我有一个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
:没有这样的文件或目录
请指导..非常感谢任何帮助。
提前致谢!
答案 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保护。