Si,
nl='
'
case $var in
(*"$nl"*) echo yes;;
(*) echo no;;
esac
(por principio, me gusta citar todas las expansiones variables dentro del case
patrón a menos que quiera que sean tratadas como un patrón, aunque aquí no hace la diferencia ya $nl
que no contiene comodines).
o
case $var in
(*'
'*) echo yes;;
(*) echo no;;
esac
Todos deberían funcionar y son compatibles con POSIX, y lo que usaría para eso. Si elimina el (
s, incluso funcionaría en el antiguo shell Bourne.
Para otra forma de establecer la $nl
variable:
eval "$(printf 'nl="\n"')"
Tenga en cuenta que $'\n'
está previsto incluirlo en la próxima versión del estándar POSIX . Ya está apoyada por ksh93
, zsh
, bash
, mksh
, busybox y FreeBSD sh
por lo menos (en febrero de 2018).
En cuanto a si la prueba que tiene es suficiente, tiene una prueba para ambos casos, por lo que probaría todas las rutas de código.
Actualmente hay algo que no se especifica claramente en la especificación POSIX: si *
coincide en una cadena que contiene secuencias de bytes que no forman caracteres válidos o si las variables de shell pueden contener esas cadenas.
En la práctica, aparte de yash
cuyas variables solo pueden contener caracteres, y aparte de los bytes NUL (que no pueden contener shell pero zsh
pueden almacenar en sus variables), *$nl*
deben coincidir en cualquier cadena que contenga, $nl
incluso si contienen secuencias de bytes que no son válidas caracteres (como $'\x80'
en UTF-8).
Algunas find
implementaciones, por ejemplo, no coincidirían con -name "*$nl*"
ellas, por lo que si prueba un nuevo shell y tiene la intención de tratar con cosas que no se garantiza que sean texto (como nombres de archivos), es posible que desee agregar un caso de prueba. Al igual que con:
test=$(printf '\200\n\200')
en un entorno local UTF-8.