2016-04-19 5 views
0

このスクリプトでは、指定されたメールボックスのサイズを確認するために使用しています。サイズはByteで返されます。はるかに簡単に "人間が読める"形式になります。BをKiBに変換する、MiBがbash関数を呼び出す

This質問は素晴らしいですが、古くなり始めており、私のニーズに合わせて回答を変更することができません。

持つ:

MAILBOX="/var/mail/$1 
GOOD=471859200 #450MB 
ACTUALSIZE=$(wc -c <"$MAILBOX") 
MAILBOXDIM=$(grep "mailbox_size_limit" /etc/postfix/main.cf | awk -F" " '{print $3}') 

私はKB/MB

if [ ! -f $MAILBOX ]; then 
    echo "Can't check the size of $MAILBOX | Size=0; Total=$MAILBOXDIM" 
    exit 3 
else 
    if [ $ACTUALSIZE -lt $GOOD ]; then 
    echo "Size of mailbox is $ACTUALSIZE | Size=$ACTUALSIZE; Total=$MAILBOXDIM" 
    exit 0 
    fi 
fi 

まあの値を印刷する必要がある、コードは同じですが、はるかに長く、多かれ少なかれです。

私は

echo "Size of mailbox is convert($ACTUALSIZE) | Size=convert($ACTUALSIZE); Total=convert($MAILBOXDIM)" 

のようなものを必要とするだろうと私は正しい機能に

EDIT書き込むことはできませんよ: おかげでみんなを!私は

ACTUALSIZE=$(wc -c <"$MAILBOX") 
ASIZE=$(convert "$ACTUALSIZE") 
echo $ASIZE 

同じ結果を達成するための2つの変数を必要とする理由あなたや将来的に誰もが疑問に思っているならば、私は値を比較するためにIFを使用しているためです。 ASIZEは "450Mib"で、IFは文字を好きではありません。

GOOD=450 
    if [ $ACTUALSIZE -lt $GOOD ]; then 
    echo "Size is $ASIZE" 
    fi 

かのawkを使用し、その後、::

ASIZE=$(convert $(wc -c <"$MAILBOX") | awk -F"MiB" '{print $1}') 
    if [ $ASIZE -lt $GOOD ]; then 
    echo "Size "$ASIZE"MiB" 
    fi 

またはマニュアルを読む:サフィックスについて hereおよびIEC/IEC-I

+2

のCoreutils V8。 21は 'numfmt'を追加しました。 'printf"%s \ n "" 12345678 "| numfmt --to = iec' – andlrc

+0

これはありがとう!以前はそれを見ていなかった。私はこれもテストしようとしています! – Nihvel

答えて

1
convert() { numfmt --to=iec-i --suffix=B "[email protected]"; } 
+0

私が探しているものを見て、ありがとう!しかし、私がそれを適用したときにスクリプトとエコー: エコー "メールボックスのサイズは" $ ACTUALSIZEを変換する " 結果は"メールボックスのサイズは465794232に変換されます " どうすればよいでしょうか? – Nihvel

+1

@Nihvelコマンド置換:メールボックスのサイズは$(convert "$ size") "または私が推奨する' printf "メールボックスのサイズは%sです。\" "$(convert" $ size ")" ' – andlrc

+0

ありがとう! 新しい$ VAR = $(convert "$ ACTUALSIZE")とe​​choed $ VAR。;)を使用して、スクリプトに挿入しやすくなりました。 – Nihvel

1
これはむしろ2つの変数を使用し解決するために

exprを次のように使用します。

expr $ACTUALSIZE/1024 
expr $ACTUALSIZE \* 1024 

単位を下または上に移動する。

またあなたは、エコーでそれを直接使用することができます。

echo $(expr $ACTUALSIZE/1024) 
+0

ありがとう!私は今cliから動作するので、このコードをスクリプトに挿入しようとしています。エコーをもっと柔軟にする方法があると思いますか?すべての行に$(expr $ ACTUALSIZE/1024)を書くのではなく、関数を呼び出したり、メインVARを編集したりするのが好きですか? – Nihvel

+0

はい、次のようなメイン変数を編集できます: ACTUALSIZE = $(expr $ ACTUALSIZE/1024) – Filip

+0

大丈夫です!私は本当に理解していない、どのように私は主なACTUALSIZEを編集する必要がありますか?私はすでにwc -cコマンドを格納するためにこれを使用しています。 あなたが気づいたように、私は開発に熟練しておらず、ソリューションを実装するのが難しいと思っています(とにかく、このコマンドが好きなので+1します)。 – Nihvel

1

いくつかの機能をint型やfloat型に変換するには:

to_kb_int() { 
    echo $(($1/1024)) 
} 

to_mb_int() { 
    to_kb_int $(($1/1024)) 
} 

to_kb_dec() { 
    echo "scale=2; $1/1024" | bc 
} 

to_mb_dec() { 
    echo "scale=2; $(to_kb_dec "$1")/1024"| bc 
} 

to_kb_int 2048 
to_mb_int 6148728 

to_kb_dec 2048 
to_mb_dec 6148728 

出力:

2 
5 
2.00 
5.86 
+0

甘い!最初に関数またはexprの部分を解く必要があり、intまたはfloatへの変換は便利です;) – Nihvel

関連する問題