問題:今日が木曜日かどうかを確認し、この状態の結果に基づいてさまざまなアクションを実行する必要があります。私は2つの異なるアプローチを試しました:
DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"];
then
echo YES
else
echo NO
fi
DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == 4];
then
echo YES
else
echo NO
fi
どちらの場合も、出力はYESであるべきですが、NOです。なにが問題ですか?
問題は、欠落しているブランクです。
次のコードは、[
組み込みコマンドが==
を=
のエイリアスとして受け入れるシェルで機能します。
if [ "$DAYOFWEEK" == 4 ]; then echo YES; else echo NO; fi
ただし、覚えておいてください(bash
のhelp test
を参照):
==
は公式には言及されていません。文字列の比較には=
を使用する必要があります-eq
は、10進数の算術テストを対象としています(ここではdate +%u
では違いはありませんが、たとえば、数値的には同じであるが字句的に異なるdate +%d
と04
を比較する場合、4
は違います)。を好む:
if [ "${DAYOFWEEK}" -eq 4 ]; then echo YES; else echo NO; fi
現在のlocaleへの依存度が低いため、一般的には、日numberアプローチをお勧めします。私のシステムでは、date +"%a"
の出力は今日Do
です。
case
を見逃さないでください。これは、多くの場合、この種のことを行うためのより良い方法です。
また、_date +%a
_の出力はロケールに依存するため、英語の名前を想定している場合、たとえばフランス語や韓国語のユーザーがスクリプトを呼び出すと、スクリプトが機能しなくなります。
_case $(LC_ALL=C date +%a) in
(Mon) echo first day of the week;;
(Thu) do-something;;
(Sat|Sun) echo week-end;;
(*) echo any other day;; # last ;; not necessary but doesn't harm
esac
_
上記は$(...)
を引用符で囲む必要がないまれなケースの1つであることに注意してください(ただし、引用符は害になりません。var="$(...)"
と同じです)。
同じ考えで、次のコードを使用して、選択した時間の前にcronを「無効」にします
もちろん、私はcrontab自体を変更したいのですが...:)に必要な権限が与えられた場合
以下は、夜間でなければbashスクリプトを中止する簡単なテストです。
# Delay or restrict execution.
# Here, we quit unless hour is greater than (gt) 2 and (-a) lower than (lt) 7
# i.e. execution happens only at 3,4,5&6 o'clock.
if /usr/bin/test `date '+%H'` -gt 2 -a `date '+%H'` -lt 7; then
echo LETS_START_PROCESSING;
else
exit;
fi
#Put job here
曜日にスクリプトを停止するには、その日の行のみを削除します。
DAYOFWEEK=$(date +"%u")
echo "$DAYOFWEEK";
if [ "$DAYOFWEEK" == 1 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 2 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 3 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 4 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 5 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 6 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 7 ]; then exit; else echo; fi