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)