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


10

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


1
補足:これら;then、と同じ行にある場合に必要ですif。この場合、それらは冗長です。
manatwork 2013年

回答:


12

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

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

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

しかし、(参照覚えておいhelp testbash):

  • ==正式には言及されていませんが=、文字列の比較に使用する必要があります
  • -eq(のためにここでの違いをすることはありません、10進演算のテストのために意図されたdate +%uためだろうがdate +%d、それは比較に来るとき、インスタンスのため044その数値同じですが、辞書的に異なっています)。

を好む:

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

現在のロケールへの依存度が低いため、通常は日数アプローチを使用する必要があります。私のシステムでは、出力date +"%a"は今日ですDo


3

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="$(...)")。


0

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

なぜ/usr/bin/testシェルの組み込み[コマンドの代わりに使用するのですか?
ステファンChazelas

@StéphaneChazelas crontabにアクセスできないため、3、4、5、6は使用しませんでした。(これは私の投稿の2行目です。)サーバーはClaranetによって管理されており、取得するための1週間分のチケットピンポンを失っています...動作するcron(冗談ではありません)。したがって、私たちはできる限り、チケットをめちゃくちゃにして再度開くことを避けます:)そのため、毎日ではなく毎時のcronタスクを要求しました。すべてのテストが完了するまで、タスクに触れない方がはるかに簡単です。実行したスクリプトにコントロールを追加します。
Balmipour 2017年

ああ、申し訳ありませんcronが、ユーザーのcrontabとは対照的に、実行可能ファイルを変更する権限がないことを意味していると思いました。
ステファンChazelas

@StéphaneChazelasテスト構文については、[]または[[]]よりも優先しました。最初に、crontabを使用できる他のサーバーでスクリプトを試しました。cronでの驚きが多すぎたため、crontabsで絶対パスをできるだけ使用するようにしました。それはテストを醜くして正しいと言うかもしれません...しかし私はシェルテストはとにかく常に醜いと答えます^^私にとって重要なのは、ほとんどの場合、単純なコピー/貼り付け、およびいくつかの説明を含みます。
Balmipour 2017年

1
-aは非推奨であることに注意してくださいtest。:標準的に、あなたが使用したいhour=$(date +%H); if [ "$hour" -gt 2 ] && [ "$hour" -lt 7 ](またはhour=`date +%H`あなたは、最近のSolaris 10およびそれ以前と、おそらくいくつかのまれなSCOのUnix系OSであるBourneシェル、と互換性が必要な場合)
ステファンChazelas

0

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

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

Unix SEへようこそ!私はあなたの最初の行を正しく理解したかどうかわかりません。if [ "$DAYOFWEEK" -lt 7 ]良いと思いませんか?
peterh-2018年

-1

まず、割り当てDAYOFWEEK = "$(date +%u)"を引用する必要があります

また、[と]ブラケットの両側にスペースが必要です。

行末のセミコロンは冗長です。


1
引用は必要ありません。
H.-Dirk Schmitt

H.-DirkSchmittさんのコメント@を拡張するには、次の理由で必要とされていない引用理由は、出力に空白が含まれていないということです。
CVn 2013年

@MichaelKjörling:いいえ-必要ありません;-)例を試してください:a=$(echo 1 2 3); echo $a;
H.-Dirk Schmitt

a=$(echo "1 2 3"); echo $a数字の間に複数のスペースがある@ H.-DirkSchmitt (残念ながらStackExchangeでは、単純なコピーアンドペーストはできません)。
CVn 2013年

@MichaelKjörling-man bashを参照「置換が二重引用符で囲まれている場合、結果に対して単語分割とパス名展開は実行されません。」したがって、質問と「1 2 3」の例の場合、違いはありません。
H.-Dirk Schmitt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.