我在下面写了一段代码来计算给定日期之后的日期:
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 :(得分:0)
问题是,如果您使用的$((val+1))
$val
以0
开头,那么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
来获取五天内的日期。