1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェル言語の日付の使用例

2022-02-12 21:50:02

    今日は何もしていない、会議があったので、シェルスクリプト言語の知識について何か書こうと思います、これも2日前にシェアアウトに使用する方法のビジネスニーズを完成させるためです、少しでも皆さんのお役に立てれば幸いです。

   まず、一般的にシェルで日付関数がどのように使われるかを見てみましょう。一番多いのは、スクリプトでログを出力する必要があるときに、そのログが生成された時刻を出力する方法で、使い慣れたものである。

LOG_FILE="/var/log/script.log"
exec 2>>${LOG_FILE}

function my_log()
{  
  local curtime=`date "+%Y-%m-%d %H:%M:%S"`
  echo "$curtime $*">> ${LOG_FILE}
}

   このmy_logのような関数を書いて、ログを出力する必要があるたびに、出力したいものを入れてこのmy_logのような関数を使えば、直接出力することができます。

   この処理では、例としてdate関数を使って指定された書式で時刻を生成しています。

[root ~]# date "+%Y-%m-%d %H:%M:%S"
2019-11-05 22:27:59

もちろん、たとえば、%H:%M:%Sをつけないとか、当月だけを表示するとか、フォーマットを定義することも可能です。

date "+%Y-%m-%d"  
--

date "+%m"

   現在の日の前後1日の時刻を取得したい場合は、以下の方法で取得できます。

[root ~]# date "+%Y-%m-%d" 
-11-05
[root ~]# date -d "1 days" "+%Y-%m-%d"           
-11-06
[root ~]# date -d "1 days ago" "+%Y-%m-%d" 
-11-04

  このように、前日の時刻を知りたい場合は、1日前と入力すればよいのです。ここでは、文字列を使って現在時刻を表示することを表す「-d」パラメータについて説明します。

   2日前に遭遇した問題は、日付から先頭の0を取り除く必要があること、つまり2019-11-05という形の日付を、2019-11-5という型に変更する必要があることでしたが、この要件はどのように実装されているのでしょうか。ここでは、2つの方法が示されています。

方法1

[dba_mysql@ /tmp]$cat test.sh
real_year=`date -d "2 days" "+%Y"`
real_month=`date -d "2 days" "+%m"`
real_day=`date -d "2 days" "+%d"`

real_date=`date -d "2 days" "+%Y-%m-%d"`
echo "real_year:"$real_date

result_year=`expr $real_year + 0`
result_month=`expr $real_month + 0`
result_day=`expr $real_day + 0`

result_date=$result_year-$result_month-$result_day

echo "processed year-month-day:"$result_date

 出力は次のようになります。

実質年・月・日:2019-11-07
処理年・処理月:2019-11-7

   この処理は、日付と月を数字に変換し、先頭のゼロを取り除く数学的計算であるexprと、先頭のゼロを取り除いた最終結果を得るための文字列スプライスによって行われていることがおわかりいただけるでしょう。

方法2

real_year=`date -d "2 days" "+%Y"`
real_month=`date -d "2 days" "+%m"`
real_day=`date -d "2 days" "+%d"`

real_date=`date -d "2 days" "+%Y-%m-%d"`
echo "real_year:"$real_date

result_year=`echo $real_year|sed 's/^0//g'`
result_month=`echo $real_month|sed 's/^0//g'`
result_day=`echo $real_day|sed 's/^0//g'`

result_date=$result_year-$result_month-$result_day

echo "Processed year-month-day:"$result_date

  このメソッドは、0から始まる文字列の前にある0をsメソッドで置き換えて、0から始まらない数字だけが結果に残るようにするもので、sedメソッドを使っています。その核となるのがsed 's/^0//g'で、これは0から始まる文字列の先頭の0を削除するものです。

    これに加えて、dateメソッドを使って、現在の日付を第1週として取得することができます。ここでは3つの引数をすべて与えると結果が出るので、違いを比較できるように列挙しておきます。

date --help has these lines
%W week number of year, with Monday as first day of week (00..53)
%U week number of year, with Sunday as first day of week (00..53)
%V ISO week number, with Monday as first day of week (01..53)

[dba_mysql@ /tmp]$date +%W

[dba_mysql@ /tmp]$date +%U

[dba_mysql@ /tmp]$date +%V

   これらの方法のうち、%Wは月曜日を週の初日とするもの、%Uは日曜日を週の初日とするもの、%VはISO週表現で、同じく月曜日を週の初日とし、第0週という概念を持たないという違いがあります。

   dateの詳しい使い方は、date --helpも参考にしてください。

以上、シェル言語でのdateの使い方の詳細な例でした。シェルでのdateの使い方については、スクリプトハウスの他の関連記事も参考にしてみてください