Shell Echo:参数列表太长
我遇到了一个问题,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
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}查看它是否超过了由试验结束错误确定的某个集合长度。