将B转换为KiB,MiB调用bash函数

时间:2016-04-19 08:05:58

标签: bash function

在这个脚本中,我用来检查给定邮箱的大小,大小以字节形式返回。以“人类可读”的格式会更容易。

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)"

我无法写出正确的功能

修改 谢谢大家!如果您或将来的任何人想知道为什么我需要2个变量来实现相同的结果

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

是因为我使用IF来比较这些值。 ASIZE是“450Mib”,IF不喜欢字母。

要解决这个问题,请使用2个变量:

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

3 个答案:

答案 0 :(得分:1)

使用expr,如:

expr $ACTUALSIZE / 1024
expr $ACTUALSIZE \* 1024

以单位向下或向上。

您也可以直接在echo中使用它:

echo $(expr $ACTUALSIZE / 1024)

答案 1 :(得分: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

答案 2 :(得分:1)

convert() { numfmt --to=iec-i --suffix=B "$@"; }