2015-09-17 3 views
0

Я запускаю следующий скрипт, который имеет функцию, предназначенную для того, чтобы рассказать мне, есть ли одна дата перед другой, как показано в самом конце скрипта.Почему мой скрипт bash создает файлы, не сообщая об этом?

Теперь в скрипте есть несколько ошибок. Но один из них, в частности, странный. Сценарий создает файлы, названные датами, которые вводятся последним аргументом.

Он создает файлы под названием «09», «12» и «2015». Почему эти файлы созданы? Вот функция. Вы заметите, последние несколько строк, которые требуют функцию с входами

function compare_two { 
if [ $1 < $2 ]; 
then 
     return 2 
elif [ $1 > $2 ]; 
then 
     return 3 
else 
     return 4 
fi 
} 


function compare_dates { 
# two input arguments: 
# e.g. 2015-09-17 2011-9-18 

date1=$1 
date2=$2 

IFS="-" 


test=($date1) 
Y1=${test[0]} 
M1=${test[1]} 
D1=${test[2]} 

test=($date2) 
Y2=${test[0]} 
M2=${test[1]} 
D2=${test[2]} 

compare_two $Y1 $Y2 
if [ $? == 2 ]; 
then 
     echo "returning 2" 
     return 2 
elif [ $? == 3 ]; 
then 
     return 3 
else 
     compare_two $M1 $M2; 
     if [ $? == 2 ]; 
     then 
       echo "returning 2" 
       return 2 
     elif [ $? == 3 ]; 
     then 
       return 3 
     else 
       compare_two $D1 $D2; 
       if [ $? == 2 ]; 
       then 
         echo $? 
         echo "return 2" 
         return 2 
       elif [ $? == 3 ]; 
       then 
         echo "returning 3" 
         return 3 
       else 
         return 4 
       fi 
     fi 
fi 
} 

compare_dates 2015-09-17 2015-09-12 
echo $? 

результат не выдаст ошибку, а выводит

returning 2 
2 

В результате неправильно, я знаю. Но я исправлю это позже. Что создает эти файлы и как их остановить? Благодарю.

+2

Поскольку '>' не оператор, который вы так думаете. Это не больше оператора в '' '. Это перенаправление вывода. Вы хотите '-gt' или' [[$ 1> $ 2]] '. –

+0

http://www.shellcheck.net/ является вашим другом. –

+0

'' '' '' '' '' как оператор сравнения строк, но вы должны убежать от него, чтобы '' '' фактически получил его в качестве аргумента. – chepner

ответ

2

нижний и более высокий знак интерпретируются как перенаправления. type man test и найти правильный синтаксис

0

Ваша проблема с [ $1 < $2 ], так как < понимается как символ перенаправления.

Решение использовать любой из этих альтернатив:

[ $1 \< $2 ] 
[ $1 -lt $2 ] 
(($1 < $2))      # works in bash. 

код [[$ 1 < $ 2]] не является целым числом сравнения, но (из инструкции):

« < и> операторы сортировки лексически с использованием текущей локали »

Я рекомендую использовать (($1 < $2)) опти на.

, чтобы избежать проблем, что некоторые числа (те, которые начинаются с нулем), как 08 вызвать проблемы при сравнении в арифметическом расширении, использование:

((10#$1 < 10#$2)) 
((10#$1 > 10#$2)) 

, чтобы заставить основание 10 для чисел.

Однако, если это возможно, используя дату GNU намного проще Имхо (это преобразование год/месяц/день в один единый номер для сравнения: секунд с начала эпохи):

a=$(date -d '2015-09-17' '+%s'); 
b=$(date -d '2015-09-12' '+%s'); 
compare_two "$a" "$b"