如何使用基于星期几的 If-Else 查询?

如何使用基于星期几的 If-Else 查询?

问题:我需要检查今天是否是星期四,并根据这种情况的结果执行不同的操作。我尝试了两种不同的方法:

获取日期名称:

DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"]; 
then   
   echo YES
else
    echo NO
fi

获取天数:

DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK

if ["$DAYOFWEEK" == 4]; 
then
   echo YES
else
   echo NO
fi

在这两种情况下,输出都是“否”,尽管它应该是“是”。怎么了?

答案1

问题是缺少空白。

以下代码将在其[内置命令接受==作为别名的shell 中运行=

if [ "$DAYOFWEEK" == 4 ];  then    echo YES; else    echo NO; fi

但请记住(参见help testbash

  • ==没有正式提到,你应该用于=字符串比较
  • -eq用于十进制算术测试(这里不会产生任何影响,但例如在比较数字上相同但词汇上不同的情况时date +%u会产生影响)。date +%d044

我会比较喜欢:

 if [ "${DAYOFWEEK}" -eq 4 ];  then    echo YES; else    echo NO; fi

一般来说,您应该更喜欢这一天数字方法,因为它对当前的依赖较少语言环境。在我的系统上,输出date +"%a"是 Today Do

答案2

不要忽视case哪种方法通常是做此类事情的更好方法:

另请注意, 的输出date +%a取决于区域设置,因此,如果您期望英文名称,则您的脚本在被法语或韩语用户调用时将停止工作。

case $(LC_ALL=C date +%a) in
   (Mon) echo first day of the week;;
   (Thu) do-something;;
   (Sat|Sun) echo week-end;;
   (*) echo any other day;; # last ;; not necessary but doesn't harm
esac

$(...)请注意,上面是不需要引用的罕见情况之一 (尽管引号不会造成损害。与 中相同var="$(...)")。

答案3

同样的想法,我使用下面的代码在选定的时间之前“禁用” cron
当然,我宁愿修改 crontab 本身...如果我被授予必要的权限:)

这是一个简单的测试,除非我们在晚上,否则它会中止 bash 脚本。

# Delay or restrict execution.
# Here, we quit unless hour is greater than (gt) 2 and (-a) lower than (lt) 7
# i.e. execution happens only at 3,4,5&6 o'clock.
if  /usr/bin/test `date '+%H'` -gt 2 -a `date '+%H'` -lt 7; then
  echo LETS_START_PROCESSING;
else
  exit;
fi

#Put job here

答案4

首先,您应该引用赋值 DAYOFWEEK="$(date +%u)"

并且 [ 和 ] 括号两边都需要有空格。

行尾的分号是多余的。

相关内容