在 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
并且根本没有变量?
答案 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%M
时0900
被解释为八进制数的问题。 (它通过使用字符串比较而不是整数比较来避免此问题。避免此问题的另一种方法是使用文字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 &