很多elif,有没有更好的方法?

mur*_*nox 3 shell-script control-flow

我有一个看起来像的 Bash 脚本

#!/bin/bash
#
FECHA=`date +%j`

if [ $FECHA -eq 40 ]
then
    echo "Esta semana le toca preparar el café a Osvaldo" | mail -s 'Café' mailgroup@somedomain.mx
    exit
elif [ $FECHA -eq 47 ]
then
    echo "Esta semana le toca preparar el café a Berenice" | mail -s 'Café' mailgroup@somedomain.mx
    exit
elif [ $FECHA -eq 54 ]
then
    echo "Esta semana le toca preparar el café a Nizaá" | mail -s 'Café' mailgroup@somedomain.mx
    exit
fi
Run Code Online (Sandbox Code Playgroud)

由于 crontab,它将在每周一早上 7 点运行。

实际的 Bash 脚本有更多的行,因为涉及的人更多。我认为它有效。但是......有没有办法用更少的行来制作这个脚本?

我在想:两个变量,一个用于制作咖啡的人,另一个用于日期以及将这些变量联系起来的方法。

sam*_*var 17

我认为这个case/esac结构很适合这里。

#!/bin/bash

case "`date +%j`" in
  40) name=Osvaldo ;;
  47) name=Berenice ;;
  54) name=Nizaá ;;
  *) exit ;;
esac

echo "Esta semana le toca preparar el café a ${name}" \
   | mail -s 'Café' mailgroup@somedomain.mx
Run Code Online (Sandbox Code Playgroud)

注意:如果同一个人需要多次煮咖啡,您可以使用以下方法聚合测试|

case "`date +%j`" in
  12|23|40|49) name=Osvaldo ;;
  10|19|30|47) name=Berenice ;;
...
Run Code Online (Sandbox Code Playgroud)


jor*_*anm 6

这是数组的一个很好的例子。下面是一个例子:

mapping=([40]='Osvaldo'
         [47]='Berenice'
         [54]='Nizaá')

echo "Esta semana le toca preparar el café a ${mapping[FECHA]}" | mail -s 'Café' mailgroup@somedomain.mx
Run Code Online (Sandbox Code Playgroud)

这完全消除了条件。

  • 这不能处理 `$FECHA` 不在这三个中的情况 - 尽管问题中的函数确实如此。事实上,我认为在那种情况下这打印的是无稽之谈。如果不测试 `$FECHA` 的值,这也会变得有点危险 - 数学替换接近于 `eval`。 (2认同)