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
の外部ツールを使用できます。grep
if
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]+
)が続きます。
^
文字列の先頭()と末尾()に一致を固定して一致の完全性を確保するため、単純な部分$
文字列一致では結果がトリガーされません。