1
#!/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

它返回错误

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

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

4

2 回答 2

2

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

echo $(( 10#$var ))

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

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

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

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

[[ ! $var < $enddate ]]
于 2020-01-16T08:56:37.563 回答
2

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

startdate=$(date -d 2009-02-21 +%s)
enddate=$(date -d 2009-11-30 +%s)
...
[[ "$startdate" -ge "$enddate" ]] || break
...
于 2020-01-16T09:11:59.287 回答