elif很多,有更好的办法吗?

elif很多,有更好的办法吗?

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

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

if [ $FECHA -eq 40 ]
then
    echo "Esta semana le toca preparar el café a Osvaldo" | mail -s 'Café' [email protected]
    exit
elif [ $FECHA -eq 47 ]
then
    echo "Esta semana le toca preparar el café a Berenice" | mail -s 'Café' [email protected]
    exit
elif [ $FECHA -eq 54 ]
then
    echo "Esta semana le toca preparar el café a Nizaá" | mail -s 'Café' [email protected]
    exit
fi

感谢 crontab,它将在每周一早上 7 点运行。

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

我在想:两个变量,一个用于煮咖啡的人,另一个用于日期,以及一种关联这些变量的方法。

答案1

我认为这个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é' [email protected]

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

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

答案2

对于数组来说这是一个很好的例子。这是一个例子:

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

echo "Esta semana le toca preparar el café a ${mapping[FECHA]}" | mail -s 'Café' [email protected]

这完全消除了条件。

答案3

将名称放入配置文件中,例如 Coffee.txt:

040=Osvaldo
047=Berenice
054=Nizaá

当有人生病、被解雇或被雇用时,您不想更改您的代码:

name=$(grep "^$(date '+%j')=" coffee.txt | cut -d= -f2-)
echo "Esta semana le toca preparar el café a ${name}" \
   | mail -s 'Café' [email protected]

答案4

如果条件后的每个代码块都if以 结尾exit,则不需要elif;只需以 结束条件即可fi

我也非常喜欢将 与 放在then同一行,if这使得代码的行数更短并且更容易(更快)阅读恕我直言。所以你的代码变成:

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

if [ $FECHA -eq 40 ]; then
    echo "Esta semana le toca preparar el café a Osvaldo" | mail -s 'Café' [email protected]
    exit
fi
if [ $FECHA -eq 47 ]; then
    echo "Esta semana le toca preparar el café a Berenice" | mail -s 'Café' [email protected]
    exit
fi
if [ $FECHA -eq 54 ]; then
    echo "Esta semana le toca preparar el café a Nizaá" | mail -s 'Café' [email protected]
    exit
fi

除此之外,在这种情况下,由于每种情况下的代码几乎相同,我将使用 Sam Hocevar 的解决方案。

相关内容