我有一个 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 的解决方案。