【问题标题】:date comparison not working properly in shell script日期比较在 shell 脚本中无法正常工作
【发布时间】:2015-01-24 09:19:23
【问题描述】:

我想在 shell 脚本中比较日期。 我使用的逻辑如下:

$date_1="Tue Nov 25 23:50:01 CST 2014"
$date_2=$(date)
if [ $date_2 -eq $date_1 ] ; then
      echo "$date2 is equal to $date_1"
else
      echo "$date2 is not equal to $date_1"
fi

但是,当我每分钟使用crontab 执行脚本时,
我在日志中收到以下不正确的消息:

Tue Nov 25 23:50:01 CST 2014 不等于 Tue Nov 25 23:50:01 CST 2014

你能帮我摆脱这种尴尬的局面吗?

【问题讨论】:

  • 还有当前日期值如何等于静态日期值?
  • 我将 date_1 静态保留为未来的日期值,并在 crontab 中每分钟安排一次此脚本。所以一旦日期匹配,它就会给出输出,但不幸的是它没有在这里发生
  • Anubhava:这是一个很好的观点......但你可以预测小时、分钟、秒,不是吗?同意这有点奇怪,但从逻辑上讲,这是有道理的。你知道明天是什么日子,不?
  • Abuzar:我怀疑涉及到空格或特殊字符。当你打印变量时,用一些东西包围它们,比如: echo "+${date_1}+ +${date_2}+" - 我不知道 { 和 } 在 Korn 中是否有效,但我认为它们可以。跨度>

标签: shell date crontab ksh


【解决方案1】:

假设此作业每分钟都在运行。你可以这样做:

date_1="Tue Nov 25 23:50:01 CST 2014"

dt1=$(date -d "$date_1" '+%Y%m%d%H%M')

dt2=$(date '+%Y%m%d%H%M')

if [ "$dt1" -eq "$dt2" ]; then
      echo "$dt2 is equal to $date_1"
else
      echo "$dt2 is not equal to $date_1"
fi

【讨论】:

    【解决方案2】:

    最好的办法是将日期字符串格式化为数字,从年份开始,然后是月份等。您可能希望编写大于或等于或小于或等于的代码,以防 cron 跳过一秒现在或以后:

    date_1=$(date +%Y%m%d%H%M%S)
    sleep 10
    date_2=$(date +%Y%m%d%H%M%S)
    if [ $date_2 -ge $date_1 ] ; then
        echo "$date_2 is greater than or equal to $date_1"
    else
    
        echo "$date_2 is less than $date_1"
    fi
    

    输出:

    20141126063044 is greater than or equal to 20141126063034
    

    请注意,在设置变量时不要将 $ 放在变量前面!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多