Bashで日付を使用すると、期待どおりに機能しますか?

Bashで日付を使用すると、期待どおりに機能しますか?

crontabエントリで毎週月曜日と木曜日に実行されるbashスクリプトがあります。

これには、以下のコードに従って1つまたは別のコードを実行する条件があります。

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月など毎週第3木曜日に実行されると予想します。そうでなければ、「条件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 いいえ前にゼロを印刷します。 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)

関連情報