【问题标题】:If- else statement shell scriptif-else 语句 shell 脚本
【发布时间】:2017-12-29 17:53:03
【问题描述】:

我正在编写一个 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

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

未达到日志限制

【问题讨论】:

  • 为什么不使用statdu(没有-h)?问题是du 也会带来文件名,除非你使用cut -f 1。理想的方法是以字节为单位获取值并进行比较。

标签: bash shell


【解决方案1】:

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

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

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

【讨论】:

  • 我按照建议尝试了各种选项,并将代码修改为 while : do FILESIZE=$(du "$FILENAME") #FILESIZE=$(stat -c%s "$FILENAME") #FILESIZE =$( du -b "$FILENAME" | cut -f1) if (( $FILESIZE > 1000000 ));然后 echo "$FILENAME is too large = $FILESIZE" echo "$(date ) is here" cd "/etc" $sudo logrotate -f logrotate.conf echo "$ 创建新版本的日志文件" else echo "日志限制未达到”fi sleep 60s 有问题的日志文件是 96185 字节..仍在旋转
  • @SoumikBhattacharya 你试过我推荐的stat 命令了吗?此外,让您的脚本在检查之前打印FILESIZE 的值,这样您就可以看到实际发生了什么。
【解决方案2】:

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

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

if (( FILESIZE > 10 ))
then

fi

【讨论】:

  • 我按照建议尝试了各种选项,并将代码修改为 while : do FILESIZE=$(du "$FILENAME") #FILESIZE=$(stat -c%s "$FILENAME") #FILESIZE =$( du -b "$FILENAME" | cut -f1) if (( $FILESIZE > 1000000 ));然后 echo "$FILENAME is too large = $FILESIZE" echo "$(date ) is here" cd "/etc" $sudo logrotate -f logrotate.conf echo "$ 创建新版本的日志文件" else echo "日志限制未达到“fi sleep 60s 有问题的日志文件是 96185 字节..仍在旋转
  • 发布您修改后的代码。另外,显示FILESIZE 的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
相关资源
最近更新 更多