
次のように、日付(日時分)が指定されたシェルを作成したいと思います。
10:00 AM Sun
2:30 PM Mon
...
正確な日付と時刻までスリープモードのままです。 1つの方法は、現在の日付を取得して差を計算できることです。それから秒に変換し、その時間の間寝ます。
しかし、シェルスクリプトを使用してこれを行う方法がわかりません。
#!/bin/bash
now=$(date '+%A %W %Y %X')
date = 2:30 PM Mon
difference = ??
sleep difference
答え1
ユーザーがコマンドを使用できる場合、at
これは完全な使用です。
$ at 08:00 022116
at> myscript.sh
at> <----------- ctrl-d here
job 9 at 2016-02-21 08:00
at
「ユーザーは実行できません」というメッセージが表示された場合は、syadminにこのユーザーが環境でどのように使用されるかに応じて、このユーザーをファイルに追加するか、at.allow
ファイルから削除するように依頼してください。at.deny
もちろん、スクリプトを書く途中で今日の長い睡眠をしたくない場合は例外です。それでも、スクリプトを2つの部分に分割して保持したい変数をファイルに書き込んでから、時間が経過してスクリプトの2番目の部分が実行されると、保存されたファイルからその変数を読み取ることができます。
答え2
#!/bin/bash
NOW=$(date +"%s")
SOON=$(date +"%s" -d "3:00 PM Sun")
INTERVAL=$(($SOON-$NOW))
sleep $INTERVAL
GNUをdate
使用すると、出力形式と表示する日付を指定できます。したがって、フォーマット文字列 "%s"を使用してエポック以降の時間を秒単位で取得し、パラメータを使用して任意の時間についても同様です-d
。違いを得ると寝る時間があります。
過去の日付を確認することは、読者の練習問題として残されます。
答え3
すでに提案されているように使用する必要があるかもしれませんが、at
タイミングの問題を処理するときに次のことが役に立ちます。一部をまとめましたが、リンクがあります。
エポックから経過した時間(秒)に近い値です。 UTC名(に任命S第二に、米数分、時間私たちの、D毎年1月1日からカレンダーにワイ耳の縮小 1900)以下の式により、エポック以降の時間(秒)に関連します。
年が1970年未満の場合、または値が負の場合、関係は定義されません。年が1970より大きく、値が負でない場合、値はすべての変数が整数型のC言語式に従って協定世界時(UTC)名に関連付けられます。
s + m*60 + h*3600 + d*86400 + (y-70)*31536000 + ((y-69)/4)*86400 - ((y-1)/100)*86400 + ((y+299)/400)*86400
ノート:
表現の最後の3つの用語は、新起源の後の最初のうるう年から始まり、うるう年の次の各年に1日を追加します。 1期は1973年から4年ごとに1日ずつ増え、2期は2001年から100年ごとに1日ずつ減り、3期は2001年から400年ごとに1日ずつ減った。式の除算は整数除算です。つまり、残りは捨てられ、整数分だけ残ります。