繁体   English   中英

if- else语句外壳脚本

[英]If- else statement shell script

我正在编写一个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部分,即:

未达到日志限制

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

这是太多的工作。 只需使用stat即可获得纯数字结果,然后对此进行数字比较。 哦,您应该坚持使用小写或大小写混合的变量名,以避免意外使用对shell具有特殊含义的变量名之一(例如PATH ):

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

您正在使用字符串比较。 例如,如果文件大小为2K,则2K > 10K是正确的,因为2依字母顺序在10之后。

最简单的解决方案是删除-h选项-如果您想进一步处理结果,反正没有多大意义-然后使用数值比较,

if (( FILESIZE > 10 ))
then

fi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM