crontab 항목에서 매주 월요일과 목요일에 실행되는 bash 스크립트가 있습니다.
여기에는 아래 코드에 따라 하나 또는 다른 코드를 실행하는 조건이 있습니다.
if [ "$(LC_TIME=C date +%a)" == "Thu" ] && [ "$(date +%d)" -ge 15 ] &&
[ "$(date +%d)" -le 21 ] && [[ "$(LC_TIME=C date +%b)" == "Feb" || "$(date +%b)" == "Apr" || "$(date +%b)" == "Jun" || "$(date +%b)" == "Aug" || "$(date +%b)" == "Oct" || "$(date +%b)" == "Dec" ]]
then
// condition a
else
// condition b
fi
위의 내용을 가장 잘 테스트하는 방법을 잘 모르겠고 bash에 그다지 자신이 없기 때문에 "조건 a"가 2월, 4월 등 매주 세 번째 목요일에 실행될 것으로 예상합니다. 그렇지 않으면 "조건 b"가 실행될 것입니다.
미리 감사드립니다.
답변1
한 번만 전화하시면 됩니다 date
. 나는 다음과 같이 쓸 것입니다 :
# ask date for the weekday, date and month: store into variables
read -r day date month < <( LC_TIME=C date "+%a %_d %b" )
# the 3rd Thu of the month has date between 15 and 21 inclusive
if [[ $day == "Thu" ]] &&
(( 15 <= date && date <= 21 )) &&
[[ ":Feb:Apr:Jun:Aug:Oct:Dec:" == *:"$month":* ]]
then
echo "code a"
else
echo "code b"
fi
이는 bash ==
연산자에 의존합니다.패턴 매칭는 문자열 항등 연산자가 아닙니다.
답변2
저것것 같다||
대략 그렇습니다. 에 배치했으므로 [[ .. ]]
및 사이에 충돌이 없어야 합니다.&&
||
어쨌든 조금 단순화할 수 있습니다. 각 테스트를 개별적으로 실행할 필요가 없으며 date
먼저 값을 변수에 저장하면 됩니다 weekday=$(LC_TIME=C date +%a)
.
또한 월 목록에는 짝수 월(2, 4, 6, 8, 10 및 12)이 포함되어 있으므로 이를 테스트할 수 있습니다. ( 는 모듈로 연산자 [ "$((month % 2))" = 0 ]
입니다 ).%
또는 실수가 없었다면 완료하세요.
weekday=$(LC_TIME=C date +%a)
dom=$(date +%-d)
month=$(date +%-m)
if [ "$weekday" = "Thu" ] &&
[ "$dom" -ge 15 ] && [ "$dom" -le 21 ] &&
[ "$((month % 2))" = 0 ]; then
echo A
else
echo B
fi
%-m
(및 %-d
)을 사용 하면date
아니요앞에 0을 인쇄합니다. Bash는 이것을 숫자가 8진수로 해석합니다. 또 다른 방법은 delete it 을 사용하는 것입니다 month=${month#0}
.
date -d
작업에 다음을 사용하여 임의의 날짜를 테스트할 수 있습니다.
date=2019-04-17
weekday=$(LC_TIME=C date -d "$date" +%a)
dom=$(date -d "$date" +%-d)
month=$(date -d "$date" +%-m)