Получение синтаксической ошибки с выражением, содержащим 10 # - PullRequest
1 голос
/ 16 января 2020
#!/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#, но я не могу придумать другой способ, как написать строку, кроме тех, что Я уже попробовал.

Ответы [ 2 ]

2 голосов
/ 16 января 2020

Преобразуйте свои даты в секунды, затем проведите сравнение, это будет лучшим подходом -

startdate=$(date -d 2009-02-21 +%s)
enddate=$(date -d 2009-11-30 +%s)
...
[[ "$startdate" -ge "$enddate" ]] || break
...
2 голосов
/ 16 января 2020

Вы передаете всю дату как числовое выражение c, поэтому 2009-02-01 интерпретируется как 2009 - 2 - 1, то есть 2009 - 3 = 2006. Попробуйте следующее:

echo $(( 10#$var ))

Но числа, начинающиеся с 0, интерпретируются как восьмеричные числа, а 08 в этом 2009-03-08 не могут быть интерпретированы как восьмеричные, поскольку в восьмеричных числах допускаются только цифры 0-7.

Может быть, вам нужно сравнивать даты как строки, а не как числа c выражения?

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

Обратите внимание, я также изменил || на &&. Также >= не существует, но вы можете заменить двойное сравнение на

[[ ! $var < $enddate ]]
...