[英]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.