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

] который закрывает [ Команда должна быть отдельным аргументом. Поставьте пробел перед ним.

Другие вопросы по тегам