Я пытаюсь сравнить две даты в сценарии оболочки, но всегда получаю неправильное значение. Это код, который я использую:
currenttime=$(date +%H%M%S);
peak_time=$(date -d "$peak_time" '+%H%M%S');
num1=$(($peak_time-$currenttime))
echo $num1
if [ $num1 < 0 ]
then
echo "peak time is bigger than current"
else
echo "peak time is smaller than now"
fi
Я всегда получаю
Пиковое время больше текущего
blockquote>Даже если оно меньше .
Я попробовал еще раз со статическими числами, например:
if [ 10 < 0 ] then echo "peak time is bigger than current" else echo "peak time is smaller than now" fi
Я всегда получаю
peak time is bigger than current
. Таким образом, операторif
всегда печатает первое предложение.
Вы также должны получить сообщение об ошибке при запуске скрипта:
/home/terdon/scripts/foo.sh: line 7: 0: No such file or directory
Это потому, что вы используете <
в [ ]
, и это не делает арифметическое сравнение, это перенаправление ввода . Таким образом, $num1 < 0
означает «запустить команду $num1
и передать ей содержимое файла 0
в качестве ввода». То, что вы хотите, это [ $num1 -lt 0 ]
, -lt
означает «меньше чем».
Конечно, ваш сценарий не имеет смысла, если вы не устанавливаете peak_time
где-либо. Эта строка:
peak_time=$(date -d "$peak_time" '+%H%M%S');
всегда будет печатать 000000
, так как при запуске его $peak_time
не имеет значения:
$ peak_time=$(date -d "$peak_time" '+%H%M%S');
$ echo $peak_time
000000
Сначала необходимо установить $peak_time
и [ 1119] затем преобразовать его в дату. например:
$ peak_time="10:05:31"
$ peak_time=$(date -d "$peak_time" '+%H%M%S');
$ echo $peak_time
100531
Итак, рабочая версия вашего скрипта будет:
#!/bin/bash
currenttime=$(date +%H%M%S);
peak_time="10:05:31"
peak_time=$(date -d "+1 hour" '+%H%M%S');
num1=$(($peak_time-$currenttime))
echo $num1
if [ $num1 -lt 0 ]
then
echo "peak time is bigger than current"
else
echo "peak time is smaller than now"
fi