if- else语句shell脚本

时间:2017-12-29 07:07:45

标签: bash shell

我正在编写一个shell脚本,根据利用SELECT R.[First Time], L.[USER], R1.[Destination Port] , L1.[IP Address] AS 'L1 IP Address',L2.[IP Address] AS 'L2 IP Address' FROM [SAPA_SOCTemp_v1].[dbo].[LookUp_15_75] AS L INNER JOIN [SAPA_SOCTemp_v1].[dbo].[Raw_15_244] AS R ON L.[USER]=R.[Source User] INNER JOIN [SAPA_SOCTemp_v1].[dbo].[Raw_15_246] AS R1 ON L.[IP]=R1.[Source IP] LEFT JOIN [SAPA_SOCTemp_v1].[dbo].[LookUp_15_76] AS L1 ON R1.[Destination IP]=L1.[IP Address] LEFT JOIN [SAPA_SOCTemp_v1].[dbo].[LookUp_15_77] AS L2 ON R1.[Destination IP]=L2.[IP Address] WHERE L.[USER]='support.treasury1' AND R.[Source User]='support.treasury1' 实用程序的大小来旋转日志文件。

logrotate.conf

即使尺寸小于10K,也不会打印#!/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块并在4.0K时旋转日志。只有当日志文件为零字节时,它才会打印if部分,即:

  

未达到日志限制

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

if (( FILESIZE > 10 ))
then

fi
相关问题