如何根据星期几使用If-Else查询?


10

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

获取日期名称:

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
旁注:;如果您then与处于同一行,则需要这些if。在这种情况下,它们是多余的。
manatwork

Answers:


12

问题是缺少空白。

以下代码将在其[内置命令==作为以下别名的外壳程序中运行=

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

但是请记住(请参阅help test中的bash):

  • ==没有正式提到,您应该使用=字符串比较
  • -eq旨在为十进制运算测试(不会让这里的区别为date +%u,但会为date +%d例如,当涉及到比较044其在数值上是相同的,但不同的词汇)。

我会选择:

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

通常,您应该首选日方法,因为它对当前语言环境的依赖性较小。在我的系统上,date +"%a"今天的输出是Do


3

不要忽略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="$(...)")。


0

按照相同的想法,我使用以下代码在选定的小时之前“禁用” 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

为什么使用/usr/bin/test代替shell的内置[命令?
斯特凡Chazelas

@StéphaneChazelas我没有使用3、4、5、6,因为我没有使用crontab的权限。(这是我的帖子的第二行:)我们的服务器由Claranet管理,我们已经失去了一周的乒乓球票才能获得……工作的cron(不是在开玩笑)。因此,我们避免在可能的情况下弄乱和重新打开票证:)出于这个原因,我们要求每小时执行一次cron任务,而不是每天一次,并且在完成所有测试之前,不碰任务将变得更加容易,并且在执行的脚本中添加我们的控件。
Balmipour

好的,抱歉,我认为您的意思是您无权修改cron可执行文件,而不是用户的crontab。
斯特凡Chazelas

@斯特凡Chazelas关于测试语法,我更喜欢它了[]或[[]],因为我想我的剧本的一些其他服务器上的第一次,在那里我可以使用crontab。在使用cron带来太多惊喜之后,我养成了习惯,尽可能在crontabs中使用绝对路径。也许有人会说它使测试变得丑陋,而且是正确的……但是我会回答说壳测试无论如何总是丑陋的,并且也将是正确的^^对我而言,最重要的是获得一个可以与一个简单的复制/粘贴,并包含一些说明。
Balmipour

1
请注意,-a中已弃用test。标准地,你会使用:hour=$(date +%H); if [ "$hour" -gt 2 ] && [ "$hour" -lt 7 ](或者hour=`date +%H`,如果你需要的是Bourne shell的,这是Solaris 10和旧的,也许一些罕见的SCO Unix系统兼容时下)
斯特凡Chazelas

0

要在星期几停止脚本,仅删除当天的行:

DAYOFWEEK=$(date +"%u")
echo "$DAYOFWEEK";
if [ "$DAYOFWEEK" == 1 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 2 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 3 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 4 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 5 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 6 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 7 ]; then exit; else echo; fi

欢迎使用Unix SE!我不确定我是否正确理解您的第一行。会if [ "$DAYOFWEEK" -lt 7 ]更好吗?
彼得-恢复莫妮卡

-1

首先,您应该引用作业DAYOFWEEK =“ $(date +%u)”

并且您需要在[和]括号的每一侧留有空格。

行尾的分号是多余的。


1
不需要报价。
H.-Dirk Schmitt 2013年

为了扩展@ H.-DirkSchmitt的注释:不需要引用的原因是输出将不包含任何空格。
CVn 2013年

@MichaelKjörling:否-永远不需要;-)试试这个例子:a=$(echo 1 2 3); echo $a;
H.-Dirk Schmitt 2013年

@ H.-DirkSchmitt a=$(echo "1 2 3"); echo $a,数字之间有多个空格(不幸的是,StackExchange 不允许我将其制成简单的复制粘贴)。
CVn

@MichaelKjörling-请参见man bash“如果替换出现在双引号中,则不会对结果进行单词拆分和路径名扩展。” 因此,在问题和“ 1 2 3”示例中没有区别。
H.-Dirk Schmitt 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.