web-dev-qa-db-ja.com

曜日に基づいてIf-Elseクエリを使用するにはどうすればよいですか?

問題:今日が木曜日かどうかを確認し、この状態の結果に基づいてさまざまなアクションを実行する必要があります。私は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です。なにが問題ですか?

10
Swagatika

問題は、欠落しているブランクです。

次のコードは、[組み込みコマンドが===のエイリアスとして受け入れるシェルで機能します。

if [ "$DAYOFWEEK" == 4 ];  then    echo YES; else    echo NO; fi

ただし、覚えておいてください(bashhelp testを参照):

  • ==は公式には言及されていません。文字列の比較には=を使用する必要があります
  • -eqは、10進数の算術テストを対象としています(ここではdate +%uでは違いはありませんが、たとえば、数値的には同じであるが字句的に異なるdate +%d04を比較する場合、4は違います)。

を好む:

 if [ "${DAYOFWEEK}" -eq 4 ];  then    echo YES; else    echo NO; fi

現在のlocaleへの依存度が低いため、一般的には、日numberアプローチをお勧めします。私のシステムでは、date +"%a"の出力は今日Doです。

12
H.-Dirk Schmitt

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="$(...)"と同じです)。

3

同じ考えで、次のコードを使用して、選択した時間の前に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
0
Balmipour

曜日にスクリプトを停止するには、その日の行のみを削除します。

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
0