2017-07-07 21 views
0

我寫下面的代碼段給定的日期後,以計算日期:如何在我的日期算術shell腳本中查找錯誤?

date=$DATE_FINAL 
declare -a max_month=(0 31 28 31 30 31 30 31 31 30 31 30 31) 
eval $(echo $date|sed 's!\(....\)\(..\)\(..\)!year=\1;month=\2;day=\3!') 
((year4=year%4)) 
((year100=year%100)) 
((year400=year%400)) 
if [ \($year4 -eq 0 -a \ 
     $year100 -ne 0 \) -o \ 
    $year400 -eq 0 ] 
then 
declare -a max_month=(0 31 28 31 30 31 30 31 31 30 31 30 31) 
fi 
day=$((day+1)) 
if [ $day -gt ${max_month[$month]} ] >| /wload/baot/home/baoted9/logs_bde27_conversion_1/ataa_display.logs 2>&1 
then 
    day=1 
    month=$((month+1)) 
    if [ $month -gt 12 ] 
    then 
    year=$((year+1)) 
    month=1 
    fi 
fi 
if [ $month -eq "08" ] || [ $month -eq "09" ] 
then 
future_date_final=$(echo $year"$month"$day) 
else 
future_date_final=$(printf "%4.4d%2.2d%2.2d" $year $month $day) 
fi 
echo "this is your final business date $future_date_final" 

它計算日期正確的代碼的如下端部然而引發錯誤 -

line 79: 08: value too great for base (error token is "08") 

它只是看起來太難看,不知道如何刪除它,否則代碼工作正常,嘗試將其重定向到仍然出現的日誌文件。 另外,我現在所面臨的問題與使用代碼普通cd命令下面的代碼以紅色突出顯示 -

echo "pset date $Param_date_1" 
cd /wload/baot/home/baotasa0/sandboxes_finance/ext_ukba_bde/pset >| /wload/baot/home/baoted9/logs_bde27_conversion_1/at_display.logs 2>&1 
sh UKBA_publish.sh UKBA $Param_date_1 3 >| /wload/baot/home/baoted9/logs_bde27_conversion_1/ate_display.logs 2>&1 

錯誤是 -

./auto2.sh: line 190: syntax error: unexpected end of file 
+0

嗯,我可以建議https://unix.stackexchange.com/questions/49053/linux-add-x-days-to-date-and-get-new-virtual-date? – 2017-07-07 14:49:34

+0

第79行的錯誤*會影響正確性 - 它會使您的比較始終是錯誤的,無論它是真實還是錯誤。 –

+0

...那個問題是因爲以前導0開頭的數字被解析爲八進制數,而'8'當然是八進制數中不可能的數字。不要將前導零置於用於計算的值上 - 只在輸出時間添加它們。 –

回答

0

的問題是,如果你使用$((val+1))如該$val0開頭,那麼bash不是以小數爲基礎運行,而是以八進制爲基礎。由於08不是8進制的有效數字,因此它會發出抱怨。

您可以通過編寫

$((10#$val+1)) 

請注意,這樣做,任何一項零去除強制十進制表示。如果您需要與前面的零的表示,只要使用

val=$(printf '%02d' $((10#$val+1))) 

僅供參考,請參閱bashmanual

常量與一家領先的0被解釋爲八進制數。前導'0x'或'0X'表示十六進制。否則,數字採用[base#] n的形式,其中可選基數是2到64之間的十進制數,代表算術基數,n是該基數中的數字。如果鹼基#被省略,則使用鹼基10。指定n時,大於9的數字以小寫字母,大寫字母'@'和'_'的順序表示。如果鹼是小於或等於36,小寫和大寫字母可以互換地使用,以10和35



PS之間表示數字:這是關於一個很好的文章falsehoods programmers believe about time我不得不讀自己。如果可能,請嘗試使用date -d而不是手動進行日期算術。您可以使用例如date -d "+5 days" +%d.%m.%Y在五天內獲取日期。