【问题标题】:Echo: Argument List too longEcho:参数列表太长
【发布时间】:2012-09-13 20:47:16
【问题描述】:

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

【问题讨论】:

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

标签: shell arguments echo ksh


【解决方案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 等脚本语言进行额外处理可能是合适的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2017-11-30
    • 2020-05-09
    • 2014-05-21
    • 2015-04-04
    • 2021-10-26
    • 2014-04-18
    • 2021-10-28
    相关资源
    最近更新 更多