次のような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スクリプトにはより多くの人が参加するので、より多くの行があります。うまくいくと思います。しかし...このスクリプトの行数を減らす方法はありますか?
私は2つの変数を考えています。 1つはコーヒーを作った人のための変数であり、もう1つは日付のための変数であり、これらの変数を関連付ける方法です。
答え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
これにより、コード行が短くなり、IMHOをより簡単に(より速く)読み取ることができます。したがって、コードは次のようになります。
#!/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のソリューションを使用します。