使用包含 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
...
#!/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
...