Bashスクリプトで文字列が正規表現に一致するかどうかを確認する 質問する

Bashスクリプトで文字列が正規表現に一致するかどうかを確認する 質問する

私のスクリプトが受け取る引数の 1 つは、次の形式の日付ですyyyymmdd

入力として有効な日付を取得するかどうかを確認したいと思います。

どうすればいいでしょうか? 次のような正規表現を使用しようとしています:[0-9]\{\8}

ベストアンサー1

テスト構造 を[[ ]]正規表現一致演算子 とともに使用して、=~文字列が正規表現パターンに一致するかどうかを確認できます(ドキュメンテーション)。

具体的なケースとしては、次のように記述できます。

[[ "$date" =~ ^[0-9]{8}$ ]] && echo "yes"

あるいは、より正確なテスト:

[[ "$date" =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes"
#             |\______/\______*______/\______*__________*______/|
#             |   |           |                  |              |
#             |   |           |                  |              |
#             | --year--   --month--           --day--          |
#             |          either 01...09      either 01..09      |
#      start of line         or 10,11,12         or 10..29      |
#                                                or 30, 31      |
#                                                          end of line

つまり、必要な形式に一致する正規表現をBashで定義できます。この方法では、次の操作を実行できます。

[[ "$date" =~ ^regex$ ]] && echo "matched" || echo "did not match"

&&テストが成功した場合は以降のコマンドが実行され、||テストが失敗した場合は 以降のコマンドが実行されます。

これは、Aleks-Daniel Jakimenkoによるソリューションに基づいています。bash でのユーザー入力日付形式の検証


他のシェルではgrepを使うことができます。シェルがPOSIX準拠の場合は、

(echo "$date" | grep -Eq  ^regex$) && echo "matched" || echo "did not match"

POSIXに準拠していない場合は、次のようにします。

echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"

注意:これらのポータブル grep ソリューションは、防水ではありません。たとえば、改行を含む入力パラメータによって騙される可能性があります。最初に述べた bash 固有の正規表現チェックには、この問題はありません。

おすすめ記事