Iya,
nl='
'
case $var in
(*"$nl"*) echo yes;;
(*) echo no;;
esac
(pada prinsipnya, saya suka mengutip semua ekspansi variabel di dalam case
pola kecuali saya ingin mereka diperlakukan sebagai pola, meskipun di sini tidak ada bedanya karena $nl
tidak mengandung wildcard).
atau
case $var in
(*'
'*) echo yes;;
(*) echo no;;
esac
Haruskah semua bekerja dan sesuai dengan POSIX, dan apa yang akan saya gunakan untuk itu. Jika Anda menghapus (
s, itu bahkan akan bekerja di shell Bourne yang lama.
Untuk cara lain mengatur $nl
variabel:
eval "$(printf 'nl="\n"')"
Catatan yang $'\n'
direncanakan untuk dimasukkan dalam versi standar POSIX berikutnya . Ini sudah didukung oleh ksh93
, zsh
, bash
, mksh
, busybox dan FreeBSD sh
setidaknya (per Februari 2018).
Adapun apakah tes yang Anda miliki sudah cukup, Anda sudah mendapatkan tes untuk kedua kasus sehingga akan menguji semua jalur kode.
Saat ini ada sesuatu yang tidak ditentukan dengan jelas dalam spesifikasi POSIX: apakah *
cocok pada string yang berisi urutan byte yang tidak membentuk karakter yang valid atau apakah variabel shell mungkin berisi string tersebut.
Dalam praktiknya, selain dari yash
variabel yang hanya dapat berisi karakter, dan selain dari byte NUL (yang tidak ada shell tetapi zsh
dapat disimpan dalam variabel mereka), *$nl*
harus cocok dengan string apa pun yang berisi $nl
bahkan jika mereka berisi urutan byte yang tidak membentuk valid karakter (seperti $'\x80'
dalam UTF-8).
Beberapa find
implementasi misalnya akan gagal cocok dengan -name "*$nl*"
mereka, jadi jika menguji shell baru, dan jika Anda bermaksud untuk berurusan dengan hal-hal yang tidak dijamin menjadi teks (seperti nama file), Anda mungkin ingin menambahkan test case untuk itu. Suka dengan:
test=$(printf '\200\n\200')
di lokal UTF-8.