如何在我的日期算术shell脚本中找到错误?

时间:2017-07-07 14:47:47

标签: shell unix scripting

我在下面写了一段代码来计算给定日期之后的日期:

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

1 个答案:

答案 0 :(得分:0)

问题是,如果您使用的$((val+1)) $val0开头,那么bash不会在十进制基数上运行,而是在八进制上运行基础。由于08不是八进制数的有效数字,因此会抱怨。

您可以通过编写

强制执行十进制表示
$((10#$val+1))

请注意,通过执行此操作,将删除任何前面的零。如果您需要使用前面的零表示,请使用

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

如需参考,请参阅bash manual

  

前导0的常量被解释为八进制数。前导'0x'或'0X'表示十六进制。否则,数字采用[base#] n的形式,其中可选的基数是2到64之间的十进制数,表示算术基数,n是该基数中的数字。如果省略base#,则使用基数10。指定n时,大于9的数字按小时字母,大写字母“@”和“_”按顺序表示。如果base小于或等于36,则可以互换使用小写和大写字母来表示10到35之间的数字。


P.S。:这是一篇关于falsehoods programmers believe about time的非常好的文章,我必须自己阅读。如果可能,尝试使用date -d而不是手动日期算术。您可以使用例如date -d "+5 days" +%d.%m.%Y来获取五天内的日期。