如何在if语句中应用两组多个条件?

时间:2017-10-13 18:15:09

标签: bash

如何将这两个主要案件分开? 周一或周三与周二或周五分开 我尝试使用paren但我一直收到错误

day=$(date  +%a) #day of week abrev
time=$(date +%R) #24 hour ie 17:34
dir=$(date +%F)  # %y-%m-%d
time=$(sed -e 's/://g' <<< $time) #remove : in time
dir=$(sed -e 's/-//g' <<< $dir) #remove - in YYYYMMDD
if [ $day == 'Mon' ] || [ $day == 'Wed' ] && [ $time -gt 1150 ] && [ $time -lt 1250 ] || 
 [ $day == 'Tue' ] || [ $day == 'Fri' ] &&  [ $time -gt 1730 ]  && [ $time -lt 1900 ] 
then
mkdir -p 444/$dir
cd 444/$dir
fi;

3 个答案:

答案 0 :(得分:2)

一种选择是使用[[代替[。这样,您就可以使用()对不同的条件进行分组。

所以在你的例子中:

if [[ ( $day == 'Mon' || $day == 'Wed' ) && ( $time -gt 1150 && $time -lt 1250 ) ]] || 
   [[ ( $day == 'Tue' || $day == 'Fri' ) && ( $time -gt 1730 && $time -lt 1900 ) ]]
then
    # Do stuff
fi

我不相信[[始终符合POSIX,但它应该可以使用bash

答案 1 :(得分:1)

您可以在[[中使用bash运算符,这是对[命令的改进。如果编写面向bash的脚本,它有几个增强功能,使其成为更好的选择。使用其=~正则表达式运算符进行正则表达式匹配,使用算术上下文运算符(( ))可以将条件降低到

time=$(date "+%H%M") # to list time from 0000 to 2359
if ( [[ $day =~ ^(Mon|Wed)$ ]] && (( time <= 1150 && time >= 1250 )) ) || \
   ( [[ $day =~ ^(Tue|Fri)$ ]] && (( time <= 1730 && time >= 1900 )) ); then
    echo "your actions here"
fi

答案 2 :(得分:0)

您可以通过在$day的值上定义基于的范围来简化此操作。然后你有一个简单的比较。

case $day in
  Mon|Wed) low=1150; high=1250;;
  Tue|Thu) low=1730; high=1900;;
  *) low=2359; high=0000;;  # Non-matching days create an impossible-to-match time
esac

if (( low < time && time < high )); then
  mkdir -p "444/$dir" && cd "444/$dir"
fi