Echo:参数列表太长

时间:2012-09-13 20:47:17

标签: 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 ]]; 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

我想在我的剧本中测试这个

我尝试了下面这个,但是我得到了所有这些废话到stdout,它填满了我的调试日志并且很烦人

echo $variable
if [[ $? -ne 0 ]]; then
write to error log
fi

有没有办法测试echo $ variable ....而不将其发送到stdout? 我试过以下,但似乎都没有用,所以我在这里有点不知所措。

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

1 个答案:

答案 0 :(得分: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)进行额外处理可能是合适的。