Shell Echo:参数列表太长

Shell Echo:参数列表太长,shell,arguments,echo,ksh,Shell,Arguments,Echo,Ksh,我遇到了一个问题,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 ]]; the

我遇到了一个问题,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的arg列表太长时,
$FIELDS
设置为null,因此我对
$FIELDS-gt 1024
的测试总是正确的,不会被捕获。 问题是当它进入数组时,它显然太大了,我得到了一个下标超出范围的错误,我的脚本退出了

非常感谢您的任何想法


编辑9/18

好的,问题是更基本一点

myserver-v1> echo $variable
myserver-v1> /usr/bin/echo: too many args
我想在我的脚本中对此进行测试

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
我尝试了下面的方法,效果很好,但是我把这些垃圾都放到了stdout中,它填满了我的调试日志,很烦人

echo $variable
if [[ $? -ne 0 ]]; then
write to error log
fi
有没有一种方法可以测试echo$变量…而不发送给stdout? 我尝试了以下方法,但两种方法都不起作用,所以我在这里有点不知所措

[[ ! `echo $variable ]]
[[ `echo $variable ]]

如果将未加引号的变量
$PROTOCOLS1
保留在
echo
中,则可以通过替换以下变量来简化操作:

FIELDS=`echo $PROTOCOLS1|wc -l`

这是因为当您回送
$PROTOCOLS1
时,如果没有任何引号,您将只有一行(可能很长)输出。或者,您可以使用:

FIELDS=$(echo "$PROTOCOLS1" | wc -l)
其中双引号将保留PROTOCOLS1值中的换行符(但它会让您回到“参数列表过长”问题)

因此,您需要考虑使用:

FIELDS=$(egrep -i 'rsh|rsync|remsh' "$file" | egrep -c -v '^[ |      ]*#')

这将获取第二个执行行计数的egrep。显然,由于脚本的后面部分使用了
$PROTOCOLS1
,因此需要重新评估
egreps
以获取数据,但您应该考虑处理方案是否合适。如果遇到太长的字符串值,则可能没有以最佳方式进行处理。选择什么取决于你想做什么,而问题并没有揭示这一点。使用诸如Perl、Python或Ruby之类的脚本语言进行额外的处理可能是合适的。

为什么不在设置数组后使用
${{myarray[*]}
来获取数组的长度(看起来与字段数相同)?(对不起,我对ksh的熟悉程度不如bash)
$(#myarry[*])
在ksh93(99%linux系统上的std(实际上不是pdksh)。如果
echo${.sh.version}
返回任何内容,那么您就有一个ksh93。祝大家好运。@evilotto我不能使用
${#myarray[*}
因为这需要数组已经存在……问题是我无法创建超过1024个元素/字段的数组……因此,我必须能够在运行
设置-数组之前进行测试。
参数列表过长的错误可能是内核限制,可能是4k或8k。您可以只检查$PROTOCO的原始长度LS1使用${#PROTOCOLS}查看它是否超过了由试验结束错误确定的某个集合长度。