다음과 같은 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
그러면 코드 줄이 더 짧아지고 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의 솔루션을 사용하겠습니다.