2012-09-13 101 views
0

我遇到了一个问题,我的echo参数列表太长,想要解决一些问题,或者至少测试一下这个问题,以便我可以正确处理它,它不会杀死我的脚本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 

所以问题是,当我回声ARG列表太长,$FIELDS设置为null,因此我对$FIELDS -gt 1024测试始终是真实的,不被抓。 问题是,当它进入数组显然太大,我得到一个下标超出范围错误,我的脚本退出。

任何想法,不胜感激。


编辑9/18

OK,所以这个问题是一个小更基本。

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 ]] 
+0

为什么不在设置之后使用'$ {#myarray [*]}'获取数组的长度(看起来像字段数)?(对不起,我不熟悉ksh比bash) –

+0

'$(#myarry [*]}'在ksh93中工作(99%linux系统上的std(实际上并不是pdksh)如果'echo $ {。 sh.version}'return anything,then you have a ksh93。祝你好运 – shellter

+0

@evilotto我不能使用'$ {#myarray [*]}'因为那样会需要数组已经存在....问题是我无法创建超过1024个元素/字段的数组...因此,我必须能够在运行'set -A数组'' – nitrobass24

回答

1

如果保持不带引号的变量$PROTOCOLS1echo,您可以通过更换生活简单化:

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之类的脚本语言进行额外的处理可能是合适的。