エルフが多すぎるのに良い方法がありますか?

エルフが多すぎるのに良い方法がありますか?

次のような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不要です。eliffi

私も本当に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のソリューションを使用します。

関連情報