0

我遇到了一个问题,我的 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 ]]
4

1 回答 1

1

如果您在 中保留未引用的变量$PROTOCOLS1,则echo可以通过替换来简化生活:

FIELDS=`echo $PROTOCOLS1|wc -l`

FIELDS=1

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

FIELDS=$(echo "$PROTOCOLS1" | wc -l)

其中双引号将保留 PROTOCOLS1 值中的换行符(但它会让你回到“参数列表太长”的问题)。

因此,您需要考虑使用:

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

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

于 2012-09-13T20:52:36.983 回答