BASH日期添加//以天为单位减法 - 语法错误

时间:2014-11-14 23:33:58

标签: linux bash date

希望快速提问。我仍然习惯了BASH的简短形式,我正在做一些非常愚蠢的语法,我只是没有看到它。所以任何帮助都会受到赞赏。

基本上我在12个月内从Hive中提取信息,但由于表格大小,我需要在几天内提取数据,例如7天。唯一的问题是因为天数可能不会平均分成最后一个循环周期需要确定剩余天数的一年。我试图在每个周期内进行检查: -

If (end date – start date) in days < 7 days then
    query end date = query start date + (end date – start date) in days
else
    query end date = query start date + 7 days

查询开始日期最初从12个月前开始,然后在每个循环周期内增加7天或上述语句剩下的任何天数。

如上所述,我的语法错误,加上日期加法/减法。我得到的错误消息很简单“语法不正确”,虽然我真的期待别的什么。据我所知,BASH没有任何简单的功能可以从另一个日期中减去一个日期来获取天数或者我错了吗?你是否介意快速浏览一下并指出我做错了什么?问题是回声的结束日期,更重要的是IF语句。

#Set dates dynamically
DT_START=$(date -d "-12 month -$(($(date +%-d)-1)) day" +%s)
DT_END=$(date -d "+1 days -$(($(date +%-d)-1)) day" +%s)
I_DAYS=7

#loop per set number of days with the 12 month period and insert into table
echo "$(date +%Y-%m-%d_%H:%M:%S): Last 12 month period is $(date -d"@${DT_START}" '+%Y-%m-%d') to $(date -d"-1 days @${DT_END}" '+%Y-%m-%d')";

while [ ${DT_START} -lt ${DT_END} ]; do
    #increment date by either the set number of days or whatever days are left on the last increment
    #date in string format for query range
    DT_STR=$(date -d"@${DT_START}" +%Y-%m-%d)
    if [ $(((${DT_END} - ${DT_START}) + 43200) / 86400) days -lt ${I_DAYS} ]; then
        DT_STR_NEXT=$(date -d"${DT_STR}+$(( ((${DT_END}-${DT_START})+43200)/86400 )) days" +%Y-%m-%d);
    else
        DT_STR_NEXT=$(date -d"${DT_STR}+${I_DAYS} days" +%Y-%m-%d);
    fi

    hive_exec "
        insert into table test
        select col1, col2, col3
        from foo
        where actual_date >= '${DT_STR}'
        and actual_date < '${DT_STR_NEXT}'";

    DT_START=$(date -d"${DT_STR_NEXT}" +%s) #increment date for next loop
done

1 个答案:

答案 0 :(得分:1)

您的语法错误来自

if [ $(((${DT_END} - ${DT_START}) + 43200) / 86400) days -lt ${I_DAYS} ]; then

...因为days作为test表达式的一部分无效。由于你的意图不明确,很难说如何最好地改善这条线。

顺便说一下,由于你的shell是bash,你可以用更自然的数学上下文语法编写它(让你在大多数情况下使用<而不是-lt和elide扩展运算符):

if (( ( ( DT_END - DT_START + 43200 ) / 86400 ) < I_DAYS )); then

那就是说,你之前有其他错误,导致这一点。使用bash -x运行脚本,您会看到以下内容:

++ date '-d-1 days @1414890352' +%Y-%m-%d
date: invalid date `-1 days @1414890352'

...对应第9行date的使用错误。通常,在调试时使用set -x是一个好主意。