bashでスラッシュ区切りの日付を簡単に比較する方法

bash-date-slash

お得意のプログラミング言語では、簡単に日付比較するための関数が用意されていますが、Linuxシェルスクリプトbash)となると、日付の方は文字列なのか数値なのか、if比較するために使用する比較演算子は何かさっぱり分からず詰まってしまったためメモします。


スラッシュ区切りの日付

まずはdateを利用して、日付フォーマットYYYY/MM/DD変数に格納します。
これも書き方がいっぱいあって困りました。
とりあえず代表的なのを2つだけ書いておきます。

# フォーマットは「'」や「"」で囲んでも良し。
TODAY=`date +%Y/%m/%d`
# バッククオートの代わりに$()で囲む?
TODAY=$(date +%Y/%m/%d)

違いがよくわからないので、詳しい方はコメントください。

前日や翌日の日付を取得する

余談ですが、date-d—dateオプションを使って、1日前1日後といった日付の取得方法もメモしておきます。

# 前日(1日前)
YESTERDAY=`date +%Y/%m/%d -d "yesterday"`
YESTERDAY=`date +%Y/%m/%d -d "1 day ago"`
YESTERDAY=`date +%Y/%m/%d -d "1 days ago"`
# 翌日(1日後)
TOMORROW=`date +%Y/%m/%d -d "tomorrow"`
TOMORROW=`date +%Y/%m/%d -d "1 day"`
TOMORROW=`date +%Y/%m/%d -d "1 days"`

if文で日付を比較

if文の書き方がイマイチわからなくて、1番詰まったところです。
端的に言うと、文字列数値比較演算子が異なること。
そして、括弧の使い方もよくわかっていません。

比較演算子

例えば、AとBが同じかを調べる場合、文字列なら「=」を使いますが、数値なら「-eq」となります。
また、数値で大小を比較する際、他のプログラミング言語では「<」や「<=」をよく使うと思いますが、これもシェルbash)だと使えないことを初めて知りました。

数値比較演算子 意味
数値1 -eq 数値2 数値1と数値2が等しければ真
数値1 -ge 数値2 数値1が数値2より大きい、もしくは等しければ真
数値1 -gt 数値2 数値1が数値2より大きければ真
数値1 -le 数値2 数値1が数値2より小さい、もしくは等しければ真
数値1 -lt 数値2 数値1が数値2未満であれば真
数値1 -ne 数値2 数値1と数値2が等しくなければ真

詳しくは参考サイトをご覧ください。

演算子とは「+」や「-」と言った計算時に使われるものだ。また比較にも使われる。プログラミングではどの言語にもある機能で、シェルスクリプトにももちろん存在する。このページではシェルスクリプトでの演算子の使い方を見ていこう。
初心者向け!シェルスクリプト演算子まとめました【Linux】 - エンジニアの入り口

日付を数値に変換して比較

日付を簡単に比較するために、まずはスラッシュ付の日付数値に置き換えなくてはなりません。
そこで、以前ご紹介した記事の応用で、変数内の/スラッシュ)を置換してあげます。

シェルで変数に格納された文字列を変更しようと思ったら、最初に思いつくのはSubStringや正規表現などですが、そんな事をしなくても簡単に末尾から任意の文字を削除できる事を最近知ったのでメモっておきます。ファイル名に日付を追加する以下の例では、ファイル名の...
【Shell】変数内の文字列の末尾から任意の文字を削除する方法 - Minory
置換する方法は以下の通りです。

${変数名//置換対象文字/置換後の文字}

これを踏まえて上記で定義した変数スラッシュを置換してみると…

# 2020/07/20 → 20200720
${YESTERDAY//\/}

スラッシュ空文字にしています。
\バックスラッシュ)はエスケープ文字です。
あと、数値にするには$(())で囲まないといけないようです。

if [[ $(( ${YESTERDAY//\/} )) -lt $(( ${TOMORROW//\/} )) ]]; then
  echo "OK!"
fi

これで数値による簡単な比較ができました!


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA