お得意のプログラミング言語では、簡単に日付比較するための関数が用意されていますが、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
これで数値による簡単な比較ができました!
- Original:https://minory.org/bash-date-slash.html
- Source:Minory
- Author:管理者
Amazonベストセラー
Now loading...