if- else语句shell脚本

问题描述 投票:1回答:2

我正在编写一个shell脚本,根据大小利用logrotate.conf实用程序来旋转日志文件。

#!/bin/bash 
FILENAME=/xyz/console.log  

    while :
    do  
        FILESIZE=$(du -h "$FILENAME")

        ####FILESIZE=$(stat -c%s "$FILENAME")

        if [[ $FILESIZE > 10K ]];
        then
            echo "$FILENAME is too large = $FILESIZE"
            echo "$(date ) is here"
            cd "/etc"
            $sudo logrotate -f logrotate.conf
            echo "$ Newer version of log file is created"
        else
            echo "Log limit is not reached"
        fi
    sleep 60s

done

exit 0

即使尺寸小于10K,也不会打印else块。在所有情况下,它正在执行if块并在4.0K时旋转日志。只有当日志文件是零字节时才打印else部分,即:

未达到日志限制

bash shell
2个回答
2
投票

问题是[[ > ]]正在进行字符串比较(基本上是字母顺序)而不是数字比较。因此,例如,[[ 9 > 10 ]]为真,因为字符“9”在ASCII排序顺序中位于“1”之后。但是切换到数字比较(使用(( > ))[[ -gt ]])也不会起作用,因为你要比较的“数字”有单位后缀(字节“B”,千字节“K”等,所以500B小于1K并且du的输出还包括文件名,在比较之前需要对其进行条带化。

这是太多的工作。只需使用stat获得纯数字结果,并对其进行数值比较。哦,你应该坚持使用低级或混合大小写的变量名,以避免意外使用对shell有特殊意义的那些(例如PATH):

...
filesize=$(stat -f %z "$filename")
if (( filesize > 10240 )); then
...

1
投票

您正在使用字符串比较。例如,如果文件大小为2K,则qazxsw poi为true,因为2在10之后按字母顺序排列。

最简单的解决方案是放弃2K > 10K选项 - 如果你想进一步处理结果,那么这没有多大意义 - 然后使用数值比较,

-h
© www.soinside.com 2019 - 2024. All rights reserved.