比较不带BC的Unix中的浮点数

时间:2019-09-26 03:21:12

标签: bash shell unix

我必须编写一段代码,将可用磁盘空间与预定值进行比较,并根据比较结果采取进一步的措施。

AVAILSIZE=$(df | head -n 2 | tail -n 1 | awk '{ print $4 }' | sed 's/G//')
if [[ $AVAILSIZE -lt 7.0 ]]
then
    echo "[INFO] Not enough disk space available. Proceeding with cleanup..."
else
    echo "[INFO] Enough disk space available. Skipping cleanup."
fi

我已经编写了这段代码。但是这里的问题是,"AVAILSIZE"是一个浮点数,在上面执行时会抛出错误"-bash: [[: 3.7: syntax error: invalid arithmetic operator (error token is ".7")"

我尝试使用bc命令,但它引发了另一个错误"-bash: bc: command not found"

请对此提供帮助。或者可能是建议另一种方法来实现我的意图。

编辑1:

这是我的df命令输出。我对第一个文件系统结果中的值3.7G感兴趣。变量AVAILSIZE的值为3.7

Filesystem                                  Size  Used Avail Use% Mounted on
/dev/mapper/cl_p10--centos7--template-root   16G   13G  3.7G  78% /
devtmpfs                                    1.9G     0  1.9G   0% /dev
tmpfs                                       1.9G     0  1.9G   0% /dev/shm
tmpfs                                       1.9G  185M  1.7G  10% /run

3 个答案:

答案 0 :(得分:1)

awk到底如何?

$ df -H | awk '                                          # I need -H for floats
NR==2 {                                                  # the 2nd row of df
    if($4+0<7)                                           # 4.1G+0 = 4.1 
        print "[INFO] Not enough disk space available."  
    else 
        print "[INFO] Enough disk space available."
}'

输出:

[INFO] Not enough disk space available.

您可以使用NR==1来定义安装点,而不是$1=="/dev/sda1"

答案 1 :(得分:0)

下面的工作。谢谢@Pacifist。

AVAILSIZE=$(df | head -n 2 | tail -n 1 | awk '{ print $4 }' | sed 's/G//')
if [[ $AVAILSIZE < 7.0 ]]
then
        echo "[INFO] Not enough disk space available. Proceeding with cleanup..."
else
        echo "[INFO] Enough disk space available. Skipping cleanup."
fi

答案 2 :(得分:0)

我如何进行这种测试:

{ read foo;read foo foo foo avail foo;}< <(df -k /)
if ((avail < 7*1024**2)) ;then
    echo "[INFO] Not enough disk space available. Proceeding with cleanup..."
else
    echo "[INFO] Enough disk space available. Skipping cleanup."
fi

说明:

  1. cmd1 < <(cmd2)运行cmd1,将输出cmd2作为输入。
  2. { read foo; read foo foo foo avail foo;}< <(...)将删除第一行,然后将第二行的第四个elem存储在$avail中(其余的行存储在$foo中)
  3. if (()) ;then用于数值测试
  4. (( a**b ))是幂b,所以 7*1024**2 Kb => 7Gb

如果确实需要,可以从那里输出 pseudo float

txtsize() {
    local _c=$1 _i=0 _a=(K M G T P) _n=$'\n'
    while [ ${#_c} -gt 3 ] ;do
        (( _i++, _c>>=10 ))
      done
    _c=000$(( ( $1*1000 ) >> ( 10*_i ) ))
    ((_i+=${3:-0}))
    printf ${2+-v} $2 "%.2f%s${_n[${2+2}]}" \
        ${_c:0:${#_c}-3}.${_c:${#_c}-3} ${_a[_i]}
}

{ read foo;read foo foo foo avail foo;}< <(df -k /)
txtsize $avail humanavail
if ((avail < 7*1024**2)) ;then
    echo "[INFO] Not enough disk space available: $humanavail. Cleanup..."
else
    echo "[INFO] Enough disk space available: $humanavail. Skipping cleanup."
fi

这项工作没有bc,也没有叉子。