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

bash-date-slash
  • URLをコピーしました!

お得意のプログラミング言語では、簡単に日付比較するための関数が用意されていますが、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が等しくなければ真

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

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

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

あわせて読みたい
【Shell】変数内の文字列の末尾から任意の文字を削除する方法 シェルで変数に格納された文字列を変更しようと思ったら、最初に思いつくのはSubStringや正規表現などですが、そんな事をしなくても簡単に末尾から任意の文字を削除でき...

置換する方法は以下の通りです。

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

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

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

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

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

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

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次