尝试获取周数时出现基本错误
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}"
我正在尝试获取上周的周数。以下命令通常有效,但现在出现错误。
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
.
您可以在 (( ... ))
:
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}"