Bash время цикла между двумя
Я пытаюсь написать bash-скрипт, который будет зацикливаться, если время идет после определенного времени и раньше определенного времени. Вот что я получил, но это дает мне ошибку;
#!/bin/bash
while [ date +"%T" -gt '06:00:00' && date +"%T" -lt '21:00:00'];
do
##echo `php mainstatquery.php`
echo "Hello World";
sleep 5;
done
и это ошибка
./timer.sh: line 3: [: missing `]'
Если бы кто-нибудь мог указать мне в правильном направлении.
4 ответа
Вот простой способ понять ваши while
проблемы:
[
фактическая команда Unix Делать ls /bin/[
и ты увидишь. Это ссылка на /bin/test
команда. Сделать man test
из командной строки и посмотреть различные тесты, которые можно сделать.
Что за while
выполняет команду, которую вы ей даете, и если она возвращает нулевой статус выхода, while
Заявление считается верным, и заявление будет продолжено. Вы можете делать такие вещи:
while sleep 2
do
echo "I slept for two seconds"
done
Все test
Команда выполняет какое-либо тестирование (файловые тесты, тесты на равенство и т. д.) и возвращает ноль, если утверждение истинно, и ненулевое значение в противном случае:
$ test 2 -gt 3
$ echo $?
1 <- That statement is false
$ [ 2 -lt 3 ] #The test command using square brackets
$ echo $?
0 <- That statement is true.
Взгляните на справочную страницу для test
и вы увидите все действительные тесты. Это:
while [ date +"%T" -gt '06:00:00' && date +"%T" -lt '21:00:00']
такой же как
while test date +"%T" -gt '06:00:00' && date +"%T" -lt '21:00:00'
Давайте рассмотрим несколько вещей здесь:
- дата + %T не является действительным оператором для
test
команда.
test
Команда не может выполнить команду внутри. Что вам нужно сделать, это поместить эту команду в $(..)
и, вероятно, используйте кавычки, чтобы избежать опасности. Таким образом:
while test "$(date +"%T")" -gt '06:00:00' && "$(date +"%T")" -lt '21:00:00'
&&
не является действительным оператором вtest
команда. То, что вы, вероятно, хотите-a
который является и соединительным для объединения двух тестов вtest
,
Это даст вам:
while test $(date +"%T") -gt '06:00:00' -a "$(date +"%T")" -lt '21:00:00'
Для сравнения есть два отдельных больше, чем тестовых оператора. Один для строк и один для целых чисел.
-gt
это тест на целые числа. Поскольку вы имеете дело со строками, вам нужно использовать>
:в то время как тест "$(дата +"%T")" > '06:00:00' -a "$(дата +"% T ")" <'21: 00: 00'
В качестве альтернативы вы могли бы также использовать &&
соединительный вместо -a
, но каждая сторона &&
должны быть отдельные тестовые заявления:
while test "$(date +"%T")" > '06:00:00' && test "$(date +"%T")" < '21:00:00'
Теперь давайте преобразуем test
синтаксис назад к [...]
потому что это легче для глаз
while [ "$(date +"%T")" > '06:00:00' -a "$(date +"%T")" < '21:00:00' ]
ИЛИ ЖЕ
while [ "$(date +"%T")" > '06:00:00' ] && [ "$(date +"%T")" < '21:00:00' ]
Кстати, внутренний [[...]]
лучше - особенно с >
знак, поскольку он может быть интерпретирован оболочкой как перенаправление файла.
while [[ "$(date +"%T")" > '06:00:00' -a "$(date +"%T")" < '21:00:00' ]]
ИЛИ ЖЕ
while [[ "$(date +"%T")" > '06:00:00' ]] && [[ "$(date +"%T")" < '21:00:00' ]]
Вы не можете сравнить целый час, как это.
Поскольку вы просто проверяете час (6<=x<=21), используйте date "+%H"
сделать это:
while [ $(date +"%H") -gt 06 ] && [ $(date +"%H") -lt 21 ];
do
##echo `php mainstatquery.php`
echo "Hello World";
sleep 5;
done
Также примите во внимание, что date
Выражение должно быть вызвано с $()
чтобы получить результат. И ваш
while [ date +"%T" -gt '06:00:00' && date +"%T" -lt '21:00:00'];
$( ) ] && [ $( ) ^ need space
Наконец, логическое условие не очень хорошо написано. Лучший рекомендуемый способ POSIX:
if [ -f $VAR1 ] && [ -f $VAR2 ] && [ -f $VAR3 ]
Похоже, вы заботитесь только о часе так:
#!/bin/bash
while [ $(date +"%k") -gt 6 -a $(date +"%k") -lt 21 ];
do
##echo `php mainstatquery.php`
echo "Hello World";
sleep 5;
done
]
который закрывает [
Команда должна быть отдельным аргументом. Поставьте пробел перед ним.