web-dev-qa-db-ja.com

今日がbashの週末かどうかを確認する方法は?

今日がbashまたはperlを使用して週末かどうかを確認する方法は?

特定のプログラムが週末に実行されるのを防ぎたい。

36
vehomzzz

以下を使用できます。

pax> if [[ $(date +%u) -gt 5 ]] ; then
   > echo weekend
   > fi

date +%uは、月曜日(1)から日曜日(7)までの曜日を示します。 5より大きい場合(土曜日= 6または日曜日= 7)、それは週末です。

したがって、スクリプトの先頭に次のようなものを置くことができます。

if [[ $(date +%u) -gt 5 ]] ; then
    echo 'Sorry, you cannot run this program today.'
    exit
fi

平日かどうかを確認するには、次のコマンドを使用します。

if [[ $(date +%u) -lt 6 ]] ; then
72
paxdiablo
case "$(date +%a)" in 
  Sat|Sun) echo "weekend";;
esac
15
ghostdog74

これは実際には驚くほど難しい問題です。「週末」は土曜日と日曜日を意味するので、「週末」を構成するものは実際には文化によって異なります(たとえば、イスラエルでは、日曜日に働き、金曜日が休みです)。 dateコマンドで日付を取得できますが、すべてのユーザーに対して機能する方法でこれを実装する場合は、各ロケールの週末を構成するものを示すいくつかの追加データを格納する必要があります。 1つの国のみを対象とする場合、他の回答で提示された解決策が機能します...しかし、ここで行われている仮定に留意することは常に良いことです。

Perlの localtime 演算子を使用します。

現地時間

Time関数によって返された時刻を、ローカルタイムゾーンに対して分析された時刻を含む9要素のリストに変換します。通常、次のように使用されます。

#  0    1    2     3     4    5     6     7     8
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

$wdayは曜日です。0は日曜日を示し、3は水曜日を示します。

例えば:

$ date 
 Sun Aug 15 20:27:29 CDT 2010 
 
 $ Perl -le 'my $ wday =(localtime)[6]; 
 print $ wday> = 1 && $ wday <= 5? "平日": "週末" '
週末
5
Greg Bacon

私は平日にプログラムを実行するこの方法が好きです:

[[ $(date +%u) -lt 6 ]] && weekday-program

それは少しトリッキーな構造ですが、コンパクトで追加が簡単です。

0
Eugene Ionichev

これがこの質問に適しているかどうかは本当にわかりませんが、他の人を助けるためにこれを共有したかったので、これが私が探していたものに最も近いスタックの質問です。

これは私がコンピューターを起動したときにアプリケーションを起動するために使用するシェルスクリプトです。アプリケーションは週末にサーバーに接続できません(サービスは週末に実行されないため、メンテナンスのためにダウンしています(外国為替取引アプリケーション)。

このスクリプトに関する情報、dは1から7(月曜日から日曜日)hは24時間です。これを独自の設定に調整できます。多分、週半ばのメンテナンスまたはその他の原因がある可能性があります。これは私の初めてのシェルスクリプトなので、もっと良い方法があると確信しています。誰かが編集をしたい場合は、遠慮なく承認を確認します(または他の誰かがそれを行う可能性があります)。

#!/bin/bash
d=$(date +%u)
h=$(date +%H)
case $d in
    '5')
    # Friday after 10pm
    if (($h >= 22)) ; then  
        exit
    fi
    ;;
    '6')
    # all day saturday
        exit
    ;;
    '7')
    #sunday before 10pm
    if (($h < 22)) ; then  
        exit
    fi
    ;;
    *)
    # any other time run the program

    ;;
esac
0
Chris

printfにも日付があります

printf -v day '%(%a)T'
case $day in 
    Sat|Sun) echo "Hooray!";;
esac

https://ideone.com/wU7C0c -デモ

0
Ivan