Значение в диапазоне с оболочкой bash - PullRequest
2 голосов
/ 09 марта 2012

В bash оболочке, как можно проверить значение, если в пределах диапазона наиболее эффективным способом?

Пример:

     now=`date +%H%M`

     if [ $now -ge 2245 ] && [ $now -le 2345 ] ; then
     ...
     fi

... этот работает, но с использованием now переменной.

Другой вариант:

     if [ $((`date +%H%M`)) -ge 2245 ] && [ $((`date +%H%M`)) -le 2345 ] ; then
     ...
     fi

... без переменной, но с выполнением date дважды.

Каксделать это с одним date выполнением и без переменной вообще?

Ответы [ 4 ]

4 голосов
/ 09 марта 2012

Во-первых, как правило, я уверен, что вам нужно ЛЮБОЕ использовать переменную ИЛИ дважды запустить команду, чтобы выполнить несколько сравнений для произвольных чисел.Нет такого обозначения, как if [ 1000 -lt $(date '+%H%M') -lt 2000 ];.

. Кроме того, вам не нужно помещать свои команды в кавычках внутри $ ((...)).Результатом команды backquoted является строка, которая /bin/[ будет интерпретироваться как -gt или -le как число.

if [ `date '+%H%M'` -gt 2245 -a `date '+%H%M'` -lt 2345 ]; then

При этом в качестве опции для времен в вашем примере вы можетепопробуйте использовать более умную date командную строку.

В FreeBSD:

if [ `date -v-45M '+%H'` -eq 22 ]; then

Или в Linux:

if [ `date -d '45 minutes ago' '+%H'` -eq 22 ]; then
3 голосов
/ 09 марта 2012

Вы можете использовать Shell Arithmetic, чтобы сделать ваш код понятным.

now=`date +%H%M`
if ((2245<now && now<2345)); then
    ....
fi
1 голос
/ 09 марта 2012

Я бы написал:

if ( now=$(date +%H%M) ; ! [[ $now < 2245 ]] && ! [[ $now > 2345 ]] ) ; then
    ...
fi

, который в основном эквивалентен вашему первому примеру, но ограничивает переменную $now до подоболочки (...), поэтому, по крайней мере, она не загрязняет пространство переменных и не приводит к перезаписи существующей переменной.

Это также (благодаря комментарию оболочки) позволяет избежать проблемы интерпретации $now как восьмеричного числа, когда %H%M (например) 0900. (Это позволяет избежать этой проблемы, используя сравнение строк вместо целочисленного сравнения. Другим способом избежать этой проблемы будет префикс всех значений с литералом 1, добавив к каждому из них 10000.)

0 голосов
/ 12 декабря 2014
#!/bin/bash
while :
    do
MAX_TIME="1845"
MIN_TIME="1545"
  if ( now=$(date +%H%M) ; ! [[ $now < $MIN_TIME ]] && ! [[ $now > $MAX_TIME ]] ) ;
    then
       echo "You are in time range and executing the commands ...!"
    else
       echo "Maximum Time is $MAX_TIME ...!"
      # echo "Current Time is $now .....!"
       echo "Minimum Time is $MIN_TIME ....!"           
  fi
sleep 4
done
#nohup sh /root/Date_Comp.sh > /dev/null 2>&1 &
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...