shell腳本報錯:value too great for base (error token is "08")

在shell開發中,會遇到將10以內的數字前面加0的情況,例如按小時分區執行hive腳本,具體代碼如下:

#!/bin/sh

START_DAY=$1
END_DAY=$2
FLAG_DAY=${START_DAY}
START_HOUR=$3
END_HOUR=$4

executeHive() {
  while :
  do
    local STAT_HOUR=00
    local FLAG_HOUR=23
    local START_DAY=$(date -d "$START_DAY 1day"  +%Y%m%d)
    local STAT_DAY=`date -d "${START_DAY} -1 day" +%Y%m%d`
    
    # 判斷執行日期是否爲開始日期或結束日期
    if [ ${STAT_DAY} -eq ${FLAG_DAY} ]; then
      STAT_HOUR=${START_HOUR}
    elif [ ${STAT_DAY} -eq ${END_DAY} ]; then
      FLAG_HOUR=${END_HOUR}
    fi
   
    while :
    do   
      printf "[INFO] `date '+%F %T'` current execute partition is dt=${STAT_DAY} hour=${STAT_HOUR}\n"
      
      exitCode=$?
      if [ $exitCode -ne 0 ];then
        printf "[ERROR] `date '+%F %T'` hivesql execute ${SOL_FILE} is failed!!!\n"
        exit $exitCode
      else
        printf "[INFO] `date '+%F %T'` hivesql ${STAT_DAY} ${STAT_HOUR} data execute success!!!\n" 
      fi
      
      # 因爲小時小於10時前面有0,shell腳本會認爲是八進制數字,所以要轉爲十進制數字
      #STAT_HOUR=$((10#$STAT_HOUR+1))
      STAT_HOUR=$(($STAT_HOUR+1))
      
       # 判斷小時是否小於10
      if [ ${STAT_HOUR} -lt 10 ]; then
        STAT_HOUR=0${STAT_HOUR}
      fi
      
      # 如果執行小時大於設置的結束小時,退出循環
      if [ ${STAT_HOUR} -gt ${FLAG_HOUR} ]; then
        break;
      fi
    
    done
    
    # 判斷執行日期是否等於結束日期,等於則退出循環
    if [ ${STAT_DAY} -eq ${END_DAY} ]; then
      break;
    fi
    
  done
}

if [ ${START_DAY} -gt ${END_DAY} ]; then
  printf "[ERROR] `date '+%F %T'` --start-day:${START_DAY} greater than --end-day:${END_DAY}\n"
  exit 1
elif [ ${START_HOUR} -ge 24 ] || [ ${START_HOUR} -lt 0 ] || [ ${END_HOUR} -ge 24 ] || [ ${END_HOUR} -lt 0 ]; then
  printf "[ERROR] `date '+%F %T'` --start-hour:${START_DAY} or --end-hour:${END_DAY} is not 00-23 \n"
  exit 1
else
  executeHive
  printf "[INFO] `date '+%F %T'` hivesql ${START_DAY} to ${END_DAY} data execute success!!!\n"
fi

當執行命令:sh houeTest.sh 20200202 20200203 19 23會報如下錯誤:
houeTest.sh: line 38: 08: value too great for base (error token is "08")
在這裏插入圖片描述
解決方法:將代碼第38行改爲第37行
STAT_HOUR=$(($STAT_HOUR+1))改爲:STAT_HOUR=$((10#$STAT_HOUR+1))就不會報錯了

發佈了100 篇原創文章 · 獲贊 46 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章