0

虽然这个错误很常见并且几乎在网络上到处都有解释,但我决定提出一个新问题,因为我无法获得这个具体案例的线索。

我正在尝试从 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 的帐户,输出应该是这样的:account/quota/used quota。

由于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

但它返回另一个错误: line 13: [: -gt: unary operator expected

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

line 13: [: : integer expression expected

我确信我越来越接近解决方案,但我现在仍然卡住了。

4

1 回答 1

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
        …

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

于 2013-10-02T09:54:53.277 回答