複数行の文字列が指定したパターンを含む行で終了しているかどうかを確認したい。
これらのコードは失敗しました、一致しません。
s=`echo hello && echo world && echo OK`
[[ "$s" =~ 'OK$' ]] && echo match
少なくともbash
では、RHSを引用すると強制的に文字列比較として扱われます
$ s=$(printf 'hello\nworld\nOK\n')
$ echo "$s"
hello
world
OK
$ [[ "$s" =~ OK$ ]] && echo "match" || echo "no match"
match
一方
$ s=$(printf 'hello\nworld\nOK$\n')
$ echo "$s"
hello
world
OK$
$ [[ "$s" =~ 'OK$' ]] && echo "match" || echo "no match"
match
あまり知られていない事実:case
もこれを行います。
case "$(printf 'hello\nworld\nOK\n')" in
*$'\nOK') echo "match";;
*) echo "no match";;
esac
$'...'
"C-style"文字列はBashの拡張機能です(シェル文字列で\n
のようなバックスラッシュエスケープコードを使用できるコンテキストを提供します)が、移植性については次のように言うことができます。
*"
OK") echo "match";;
完全にPOSIX互換のシェルスクリプトを取得します。
ただし、case
ステートメントで使用できるパターンはシェルグロブパターンであり、適切な正規表現ではありません。