シェルで奇妙な動作が発生します。
正規表現の「_」を16進コードに一致させようとすると機能しますが、「(」では機能しません。
$ regex1=$'\x5f'
$ pattern1='_'
$ if [[ $pattern1 =~ $regex1 ]]; then echo yes; else echo no; fi
yes
$ regex2=$'\x28'
$ pattern2='('
$ if [[ $pattern2 =~ $regex2 ]]; then echo yes; else echo no; fi
no
この行動を説明できますか?
答え1
regex2=$'\x28'
まったく同じですregex2='('
。シェルは$'...'
値を割り当てるときに引用符を処理します。(
それ自体は無効な正規表現なので、次の終了ステータスを返す[[ =~ ]]
ことでエラーが報告されます2
。
$ re='('; [[ "(" =~ $re ]]; echo "$?"
2
(もちろんif
ステートメント内では、1
「一致しない」終了コードと「エラー」終了コードの2
違いを区別できませんが、違いはあります。)
正規表現で開く括弧をエスケープする必要があります。
$ re='\('; [[ "(" =~ $re ]] && echo match
match
またはかっこグループに入れてください。
$ re='[(]'; [[ "(" =~ $re ]] && echo match
match
クイックテスト後、Bashの正規表現は16進数または8進数の文字エスケープをサポートしていないため、機能しませre='\050'
んre='\x28'
。