尝试从zimbra获取数据时出现BASH ERROR:对于基数来说价值太大了

时间:2013-10-02 08:44:56

标签: bash octal zimbra

虽然这个错误非常普遍,几乎在网上的任何地方都有解释,但我决定提出一个新的问题,因为我无法得到这个具体案例的线索。

我正在尝试从Zimbra Collaboration Suite获取一些数据,我能做到的唯一方法是通过bash。

我第一次使用bash时发现它有点难以处理。这是代码:

#!/bin/bash

all_account=`zmprov -l gaa`;
declare -i szquota
szquota=524288000
for account in ${all_account}
do
        mb_size=`zmmailbox -z -m ${account} gms`;
        set -i size;
declare -i quota
declare -i quota2
        for size in ${mb_size}
        do
                if [ $((10#$size)) -gt $((10#$szquota)) ] ; then
                        quota=`zmprov ga ${account} zimbraMailQuota`;
quota2="10#`zmprov ga ${account} zimbraMailQuota`";
                        echo "${account},${mb_size},$quota2\n";
                fi
        done
done

这是回复:

line 12: 137,08: value too great for base (error token is "08")

我需要打印配额超过500MB的所有帐户,输出应该是这样的:帐户/配额/已用配额。

由于mb_size是一个值数组,我无法弄清楚如何将其内容转换为十进制基数,就像我使用其他值一样? 它可能比我的头脑看起来简单得多,但我真的无法摆脱这个麻烦。 亲切的问候

编辑:

谢谢@Alfe!

我修改了这样的代码:

#!/bin/bash

all_account=`zmprov -l gaa`;

szquota=524288000
for account in ${all_account}
do
        mb_size=`zmmailbox -z -m ${account} gms`;
        declare -i quota
        declare -i quota2
        for sizeStr in ${mb_size}
        do
        if [ $size -gt $((10#$szquota)) ] ; then # <--- line 13
                        quota=`zmprov ga ${account} zimbraMailQuota`;
quota2="10#`zmprov ga ${account} zimbraMailQuota`";
                        echo "${account},${mb_size},$quota2\n";
                fi
        done
done

但它返回另一个错误:     第13行:[: - gt:一元运算符预期

我还尝试将if子句中的值括在引号之间,但如果我没有错,bash会将引号的内容解释为字符串并返回:

line 13: [: : integer expression expected

我确信我已接近解决方案,但此刻我仍然陷入困境。

1 个答案:

答案 0 :(得分:0)

您将变量size声明为set -i size的整数。稍后你尝试分配一个值,然后检查它是一个有效的整数,它不是,然后你得到错误。在您的情况下,${mb_size}中的一个值是字符串08,然后将其解释为错误的八进制值。

我建议你让循环遍历另一个未声明为int的变量(因此for语句不会产生问题),然后作为第一个语句分配循环变量的字符串值正确,以便它不会被解释为八进制:

for sizeStr in ${mv_size}
do
    size=$((10#$sizeStr))
    if [ $size -gt $((10#$szquota)) ]
    then
        …

您当然也可以将变量的声明删除为整数。这可能也解决了这个问题。