是bash shell的范围值

时间:2012-03-09 15:05:06

标签: linux bash shell

bash shell中,如何通过最有效的方式在范围内检查值?

示例:

     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 个答案:

答案 0 :(得分:4)

首先,作为一般规则,我非常确定您需要使用变量或运行命令两次以对任意数字进行多重比较。没有if [ 1000 -lt $(date '+%H%M') -lt 2000 ];这样的表示法。

此外,您不需要将反引号命令放在$((...))中。反引号命令的结果是一个字符串,其中/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

答案 1 :(得分:3)

您可以使用Shell Arithmetic清除代码。

now=`date +%H%M`
if ((2245<now && now<2345)); then
    ....
fi

答案 2 :(得分:1)

我会写:

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

大部分等同于您的第一个示例,但将$now变量限制为子shell (...),因此至少它不会污染您的变量空间或冒着覆盖现有变量的风险。< / p>

它也(由于shellter的评论)避免了在$now(例如)%H%M0900被解释为八进制数的问题。 (它通过使用字符串比较而不是整数比较来避免此问题。避免此问题的另一种方法是使用文字1为所有值添加前缀,为每个值添加10,000。)

答案 3 :(得分:0)

#!/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 &