はい、
nl='
'
case $var in
(*"$nl"*) echo yes;;
(*) echo no;;
esac
(原則case
として、パターンとして扱われることを望まない限り、パターン内のすべての変数展開を引用します$nl
が、ワイルドカードが含まれていないため、違いはありません)。
または
case $var in
(*'
'*) echo yes;;
(*) echo no;;
esac
すべてが機能し、POSIXに準拠している必要があります。(
s を削除すると、古いBourneシェルでも機能します。
$nl
変数を設定する別の方法:
eval "$(printf 'nl="\n"')"
$'\n'
POSIX標準の次のバージョンに含まれる予定であることに注意してください。それはすでにによってサポートされていますksh93
、zsh
、bash
、mksh
、busyboxのとFreeBSD sh
少なくとも(2018年2月現在)。
あなたが持っているテストが十分であるかどうかに関しては、両方のケースのテストがあり、すべてのコードパスをテストすることになります。
現在、POSIX仕様で明確に指定され*
ていないものがあります。有効な文字を形成しないバイトシーケンスを含む文字列と一致するかどうか、またはシェル変数にそれらの文字列が含まれるかどうかです。
実際には、yash
その変数に文字のみを含めることができること、およびNULバイト(シェルにはないがzsh
変数に格納できる)を除いて、有効な形式ではないバイトのシーケンスが含ま*$nl*
れ$nl
ている場合でも、含む文字列と一致する必要があります文字($'\x80'
UTF-8など)。
find
たとえば、一部の実装は-name "*$nl*"
それらとの一致に失敗するため、新しいシェルをテストする場合、テキストであることが保証されていないもの(ファイル名など)を処理する場合は、そのためのテストケースを追加できます。と同じように:
test=$(printf '\200\n\200')
UTF-8ロケールで。