엘프가 너무 많은데 더 좋은 방법이 있나요?

엘프가 너무 많은데 더 좋은 방법이 있나요?

다음과 같은 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필요하지 않습니다 .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의 솔루션을 사용하겠습니다.

관련 정보