使用包含 10# 的表达式获取语法错误

Getting a Syntax error with an expression containing 10#

#!/bin/bash
startdate=2009-02-21
enddate=2009-11-30
var=$startdate
while true
do
echo $var
touch $var.txt

#it's line 9
[[ "10#$var" -ge "$enddate" ]] || break

var=$(date +%Y-%m-%d --date "$var +1 day")
done

它returns错误

line 9:value too great for base (error token is "08")

显然,错误在表达式 10# 中,但除了我已经尝试过的方法之外,我想不出其他方式来编写字符串。

您将整个日期作为数字表达式传递,因此 2009-02-01 被解释为 2009 - 2 - 1,即 2009 - 3 = 2006。请尝试以下操作以查看:

echo $(( 10#$var ))

但以0开头的数字被解释为八进制数,但是2009-03-08中的08不能被解释为八进制数,因为八进制数中只允许数字0-7。

也许您需要将日期作为字符串而不是数字表达式进行比较?

[[ $var == $enddate || $var > $enddate ]] && break

请注意,我还将 || 更改为 &&。此外, >= 不存在,但您可以将双重比较替换为

[[ ! $var < $enddate ]]

将您的日期转换为秒数然后进行比较,这将是更好的方法 -

startdate=$(date -d 2009-02-21 +%s)
enddate=$(date -d 2009-11-30 +%s)
...
[[ "$startdate" -ge "$enddate" ]] || break
...