お得意のプログラミング言語では、簡単に日付比較するための関数が用意されていますが、Linuxのシェルスクリプト(bash)となると、日付の方は文字列なのか数値なのか、if
文比較するために使用する比較演算子は何かさっぱり分からず詰まってしまったためメモします。
目次
スラッシュ区切りの日付
まずはdate
を利用して、日付のフォーマットをYYYY/MM/DD
で変数に格納します。
これも書き方がいっぱいあって困りました。
とりあえず代表的なのを2つだけ書いておきます。
1 2 3 4 |
# フォーマットは「'」や「"」で囲んでも良し。 TODAY=`date +%Y/%m/%d` # バッククオートの代わりに$()で囲む? TODAY=$(date +%Y/%m/%d) |
違いがよくわからないので、詳しい方はコメントください。
前日や翌日の日付を取得する
余談ですが、date
の-d
(—date
)オプションを使って、1日前や1日後といった日付の取得方法もメモしておきます。
1 2 3 4 5 6 7 8 |
# 前日(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】
演算子とは「+」や「-」と言った計算時に使われるものだ。また比較にも使われる。プログラミングではどの言語にもある機能で、シェルスクリプトにももちろん存在する。この...
日付を数値に変換して比較
日付を簡単に比較するために、まずはスラッシュ付の日付を数値に置き換えなくてはなりません。
そこで、以前ご紹介した記事の応用で、変数内の/
(スラッシュ)を置換してあげます。
【Shell】変数内の文字列の末尾から任意の文字を削除する方法
シェルで変数に格納された文字列を変更しようと思ったら、最初に思いつくのはSubStringや正規表現などですが、そんな事をしなくても簡単に末尾から任意の文字を削除でき...
置換する方法は以下の通りです。
1 |
${変数名//置換対象文字/置換後の文字} |
これを踏まえて上記で定義した変数のスラッシュを置換してみると…
1 2 |
# 2020/07/20 → 20200720 ${YESTERDAY//\/} |
スラッシュを空文字にしています。\
(バックスラッシュ)はエスケープ文字です。
あと、数値にするには$(())
で囲まないといけないようです。
1 2 3 |
if [[ $(( ${YESTERDAY//\/} )) -lt $(( ${TOMORROW//\/} )) ]]; then echo "OK!" fi |
これで数値による簡単な比較ができました!
コメント