shell: =~ 演算子が期待どおりに動作しません

shell: =~ 演算子が期待どおりに動作しません

次のスクリプトを考えてみましょう。

#! /bin/bash

line="confusing"

if [[ $line =~ [[:lower:]]* ]]
then
    echo "matches!"
else
    echo "does not match."
fi

上記のコードは期待した結果を生成しますが、次のコードはそうではありません。

#! /bin/bash

line="CoNfUsInG"

if [[ $line =~ [[:lower:]]* ]]
then
    echo "matches!"
else
    echo "does not match."
fi

これは「一致!」を印刷します
。正規表現は[[:lower:]]*0個以上の小文字を意味しませんか?

以下に「matches!」も印刷すると、さらに混乱します。

#! /bin/bash

line="CoNfUsInG"

if [[ $line =~ [[:digit:]]* ]]
then
    echo "matches!"
else
    echo "does not match."
fi

なぜこれが起こるのかを説明できる人はいますか?

ベストアンサー1

正規表現は文字列全体と一致する必要はありません。そのため、文字列の先頭と末尾にそれぞれとがあります^$

[[ CoNfUsInG =~ ^[[:lower:]]*$ ]] || echo no

CoNfUsInGlY、^[[:lower:]]*(なし$)は、文字列の先頭に小文字がないため、まだ一致します。

おすすめ記事