如何将这两个主要案件分开? 周一或周三与周二或周五分开 我尝试使用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;
答案 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