Case ステートメント内の有効なバージョン番号と一致します。

Case ステートメント内の有効なバージョン番号と一致します。

case仕様のバージョン番号と一致させたいです。バージョン番号は次のとおりです。

1.12.0.32
1.12.0.32.1
2.10.0.30.1.2

そしてシェル変数に保存されますversion

インターネットで検索してみると、-statementで正規表現を一致させることは難しくありませんcase。しかし、-statementでこれを行う方法についてのアイデアを持っている人、または助けることができる人はいますかcase

私は成功せずに次のことを試しました。

case "$version" in
    "([0-9]+\.*)+")
                  echo "Correct"
        ;;
                 *)
                  echo "Not Correct"
        ;;
esac

答え1

caseシェルモードのみがサポートされ、正規表現はサポートされていません。しかし、Bashは別の構文を使用してすぐに正規表現をサポートします。

たとえば、「ドットで区切られた任意の数の小数点以下」を意味し、後に続く文字やラベルがない場合、このパターンは^[0-9]+(\.[0-9]+)*$適切です。([0-9]+\.*)+文字列を連続点または末尾の点と一致させることも可能です。たとえば、次のように1.2..3.なります。

#!/bin/bash
re='^[0-9]+(\.[0-9]+)*$';
if [[ $version =~ $re ]]; then
    echo "'$version' matches the pattern"
else
    echo "'$version' doesn't match"
fi

正規表現は、任意の小数点以下の数字([0-9]+)の後にリテラル(·)*点()と任意の数の小数点以下の\.数字()で構成される任意の数のグループ([0-9]+)を見つけることを意味します。パターンを文字列の先頭と末尾に固定^します$。それ以外の場合は、一致する部分文字列で十分です。

たとえば、123複数の数字とドットが必要な場合は^[0-9]+(\.[0-9]+)+$(最後の数字*をに変更+)を使用します。

ロケールによっては、[0-9]一致する内容が多少奇妙になる可能性があります。許可されている文字を綴ると[0123456789]より厳しくなりますが、書くのが難しく、エラーが発生しやすくなります。

答え2

case正規表現ではなくシェルパターンと一致します。したがって、^[0-9]+(\.[0-9]+)*$正規表現の代わりに次を使用できます。

case $version in
  '' | *[!0123456789.]* | .* | *. | *..* ) echo invalid;;
  * ) echo fine;;
esac

つまり、一致の意味を「反転」し、標準シェルパターンを使用して無効な条件を検出します。

bashオプションはステートメント内の一致extglobに適用されます。したがって、matchを使用してcase設定shopt -s extglobします。+()*()+([0123456789])*(.+([0123456789]))

答え3

これが不要な場合は、次caseの外部ツールを使用できます。grepif

if grep -q -E '^[0-9]+(\.[0-9]+)*$' <<< "$version"
then
    printf "%s is a valid version\n" "$version"
else
    printf "%s is NOT a valid version\n" "$version"
fi

以下を含むバージョン文字列を受け入れます。

  • 1つ以上のフィールドは1つ以上の連続した数字([0-9]+)で構成され、その後には
  • 0個以上の区切り記号.\.正規表現では、単に.「すべての文字」を意味するようにエスケープされました。)、その後に1つ以上の連続した数字(再[0-9]+)が続きます。

^文字列の先頭()と末尾()に一致を固定して一致の完全性を確保するため、単純な部分$文字列一致では結果がトリガーされません。

関連情報