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



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

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

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

您可以通过写入来强制十进制表示

$((10#$val+1))

请注意,通过这样做,将删除任何前面的零。如果您需要具有前面为零的表示形式,只需使用

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

有关参考,请参阅bash手册:

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


PS:这是一篇非常好的文章,关于程序员认为我自己阅读的时间的虚假信息。如果可能,请尝试使用date -d而不是手动日期算术。例如,您可以使用date -d "+5 days" +%d.%m.%Y在五天内获取日期。

最新更新