この単純なbashスクリプトを見てください。
#!/bin/bash
if [[ $1 =~ a* ]]; then
echo "match"
fi
最初の引数として何が提供されているかに関係なく、常に「一致」を出力するようです。(bash 3.2および4.xでテスト済み)
質問:
私が間違っていることは何ですか?
正規表現a*
は、「文字aの0回以上の出現に一致する」ことを意味します。したがって、を入力するfoo
と、ゼロa
が一致するため、式は真になります。を入力するbar
と、1つa
が一致するため、これも当てはまります。入力した入力はすべて一致します。
a+
文字の1つ以上の出現箇所を一致させたい場合は、に変更してみてくださいa
。
$ [[ foo =~ a+ ]] && echo match || echo "no match"
no match
$ [[ bar =~ a+ ]] && echo match || echo "no match"
match
推測するだけです。「a*」は「a」に0回以上一致します。これは、ほとんどすべての文字列に一致します。したがって、「a」を1回以上一致させるには、代わりに「a+」を使用する必要があると思います。また、達成したい内容に応じて、行の開始/終了時に一致するように「^」または「$」を追加することもできます。
乾杯、アレックス
編集:ああ、また遅すぎる;-)少なくとも私の推測は正しかったようだ;-)