我必须编写一段代码,将可用磁盘空间与预定值进行比较,并根据比较结果采取进一步的措施。
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
答案 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
说明:
cmd1 < <(cmd2)
运行cmd1
,将输出cmd2
作为输入。 { read foo; read foo foo foo avail foo;}< <(...)
将删除第一行,然后将第二行的第四个elem存储在$avail
中(其余的行存储在$foo
中)if (()) ;then
用于数值测试(( 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
,也没有叉子。