web-dev-qa-db-ja.com

シェルは、複数行の文字列が指定されたパターンを最後の行に含むかどうかをテストします

複数行の文字列が指定したパターンを含む行で終了しているかどうかを確認したい。

これらのコードは失敗しました、一致しません。

s=`echo hello && echo world && echo OK`
[[ "$s" =~ 'OK$' ]] && echo match
5
gzc

少なくとも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
2
steeldriver

あまり知られていない事実:caseもこれを行います。

case "$(printf 'hello\nworld\nOK\n')" in
  *$'\nOK') echo "match";;
  *) echo "no match";;
esac

$'...' "C-style"文字列はBashの拡張機能です(シェル文字列で\nのようなバックスラッシュエスケープコードを使用できるコンテキストを提供します)が、移植性については次のように言うことができます。

*"
OK") echo "match";;

完全にPOSIX互換のシェルスクリプトを取得します。

ただし、caseステートメントで使用できるパターンはシェルグロブパターンであり、適切な正規表現ではありません。

0
tripleee