如何在Bash中将字符串转换为整数?

时间:2019-03-19 18:28:37

标签: bash fedora

我正在尝试创建一个cronjob,它将根据特定文件夹的磁盘使用情况输出来运行。在我的测试环境中,我有一个名为“ Test”的文件夹,它的大小为4.0 KB。我要查询其大小:

du -csh /home/<username>/Test | grep total | cut -f1 | tr -d 'K'

输出被分配给一个名为DISK_SPACE的变量,并留下4.0给我。我无法弄清楚如何将4.0转换为整数以满足以下条件:

if [ $DISK_SPACE -gt 3.0 ]
then
rm -rf /home/<username>/Test/*.*
else
echo $DISK_SPACE "is less than 3.0K and as a result the contents of the folder will NOT be deleted."

我的完整bash文件如下所示:

#!/bin/bash
DISK_SPACE=$(du -csh /home/<username>/Test | grep total | cut -f1 | tr -d 'K')
echo $DISK_SPACE
if [ $DISK_SPACE -gt 3.0 ]
then
rm -rf /home/<username>Test/*.*
else
echo $DISK_SPACE "is less than 3.0K and as a result the contents of the folder will NOT be deleted."
fi

运行此命令后收到的错误是:

4.0: integer expression expected

4 个答案:

答案 0 :(得分:4)

du -h打印供人类使用的数字。脚本不应使用-h。尝试使用-k-b来获取易于解析的整数:

-k     like --block-size=1K

-b, --bytes
       equivalent to '--apparent-size --block-size=1'

答案 1 :(得分:0)

使用printf将您的实数舍入为整数。

printf "%1.0f\n" 4.0
4

printf "%1.0f\n" 4.6
5

请参见printf联机帮助页。

例如,您可以这样做:

DISK_SPACE=4.0
DISK_SPACE=$(printf "%1.0f" ${DISK_SPACE})
echo ${DISK_SPACE}
4

答案 2 :(得分:0)

Bash不支持浮点运算。如果您只关心第一个数字是否大于3,则可以简单地修剪任何小数。

if [ "${disk_space%.*}" -gt 3 ]; then ...

如果需要适当的浮点比较,那么实际上use a tool which supports floating-point arithmetic.

可能会更简单

还请注意,我已将您的变量转换为小写。您should not use all-uppercase names for your private variables.

答案 3 :(得分:0)

除了约翰·库格曼(John Kugelman)的答案之外,我还更改了以下行:

原文:

if [ $DISK_SPACE -gt 3.0 ]

新功能:

if [ $DISK_SPACE -gt 3072 ]

这允许John建议的更改在脚本中更好地工作:

du -csb /home/<username>/Test | grep total | cut -f1