尝试获取周数时出现基本错误

Base error when trying to get week number

我正在尝试获取上周的周数。以下命令通常有效,但现在出现错误。

lastweeknumber=$((`date +%V`-1))
bash: 09: value too great for base (error token is "09")

这周的数字是 09,所以我试过像这样 10# 转换为十进制添加 $(10#(date +%V)) 但它不起作用。

如何解决这个问题?

这是因为 date +%V returns 09 和 shell 将任何以 0 开头的值解释为八进制数。请注意 09 是无效的八进制数,因此您会收到该错误 value too great for base.

您可以在 (( ... )):

中强制执行模块 10 运算
echo $(( 10#$(date +%V) - 1 ))

8

另一种正确处理环绕年份的方法:

lastweeknumber=$(date -d "1 week ago" +%V)

考虑以下内容,它使用 bash 的内置功能代替外部 date 命令,因此需要最近的 shell 版本,但速度要快得多运行(并且将在不依赖于 date 的特定版本的情况下保持一致的行为)。

尽管如此,仍然需要去除前导 0 -- 参数扩展就可以做到:

printf -v seconds_now '%(%s)T' -1
printf -v weeknum_lastweek '%(%V)T' "$(( seconds_now - (60 * 60 * 24 * 7) ))"
echo "The index of last week is ${weeknum_lastweek#0}"