Bash에서 날짜를 사용하면 예상대로 작동합니까?

Bash에서 날짜를 사용하면 예상대로 작동합니까?

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)

관련 정보