【发布时间】:2012-09-13 20:47:16
【问题描述】:
我遇到了一个问题,我的 echo 参数列表太长,想了解如何解决这个问题,或者至少测试一下条件,以便我可以正确处理它,它不会不要杀死我的脚本
for file in `cat filelist`; do
PROTOCOLS1=`egrep -i 'rsh|rsync|remsh' "$file" | egrep -v '^[ | ]*#'`
FIELDS=`echo $PROTOCOLS1|wc -l`
if [[ $FIELDS -gt 1024 ]]; then
echo $file >> $debuglog
else
set -A myarray $PROTOCOLS1
do stuff.....
fi
done
所以问题是,当我的 echo 参数列表太长时,$FIELDS 设置为 null,因此我对 $FIELDS -gt 1024 的测试始终为真,不会被捕获。
问题是当它进入数组时,它显然太大了,我得到一个下标超出范围的错误并且我的脚本退出了。
非常感谢任何想法。
编辑 9/18
好的,所以问题更基本了。
myserver-v1> echo $variable
myserver-v1> /usr/bin/echo: too many args
我想在我的脚本中对此进行测试
我尝试了以下方法,它有效,但我将所有这些废话都发送到标准输出,这会填满我的调试日志并且很烦人
echo $variable
if [[ $? -ne 0 ]]; then
write to error log
fi
有没有办法测试 echo $variable....而不将其发送到标准输出? 我尝试了以下方法,但似乎都不起作用,所以我在这里有点不知所措。
[[ ! `echo $variable ]]
[[ `echo $variable ]]
【问题讨论】:
-
设置后为什么不直接使用
${#myarray[*]}来获取数组的长度(看起来和字段数一样)? (抱歉,我对 ksh 的了解不如 bash) -
$(#myarry[*]}在 ksh93 中工作(99% linux 系统上的 std(实际上不是 pdksh)。如果echo ${.sh.version}返回任何内容,那么您就有了 ksh93。祝大家好运。 -
@evilotto 我不能使用
${#myarray[*]},因为这需要数组已经存在......问题是我无法创建超过 1024 个元素/字段的数组......因此我必须能够在运行set -A array之前进行测试 -
参数列表过长的错误可能是内核限制,可能是4k或8k。您可以使用 ${#PROTOCOLS} 检查 $PROTOCOLS1 的原始长度,看看它是否超过了由试用结束错误确定的某个设定长度。