0

このエラーは非常に一般的であり、Web 上のほぼすべての場所で説明されていますが、この特定のケースの手がかりが得られないため、新しい質問をすることにしました。

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、他の値で行ったように、その内容を 10 進数に変換する方法がわかりませんか? おそらく、私の頭で考えているよりもはるかに単純ですが、私は本当にこの問題から抜け出すことができません. 敬具

編集:

ありがとう@アルフ!

次のようにコードを変更しました。

#!/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。後で、有効な整数であるかどうかをチェックする値を代入しようとしましたが、そうではない場合、エラーが発生します。あなたの場合、値の 1 つは${mb_size}文字列08であり、これは不正な 8 進数値として解釈されます。

intとして宣言されていない別の変数でループを実行することをお勧めします(forステートメントが問題を引き起こさないようにするため)。次に、最初のステートメントとして、ループ変数の文字列値を適切に割り当てて、解釈されないようにします8進数として:

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

もちろん、変数の宣言を整数として削除することもできます。これはおそらく問題も解決するでしょう。

于 2013-10-02T09:54:53.277 に答える