Encontré la solución aquí.
#!/bin/bash
x=`tail -n 1 "$1"`
if [ "$x" == "" ]; then
    echo "Newline at end of file!"
else
    echo "No Newline at end of file!"
fi
 
 IMPORTANTE:¡Asegúrese de tener los derechos para ejecutar y leer el script!chmod 555 script 
USO:
./script text_with_newline        OUTPUT: Newline at end of file!
./script text_without_newline     OUTPUT: No Newline at end of file!
 Solo escribe:
cat -e nameofyourfile
 
 Si hay una nueva línea, terminará con $ símbolo. Si no, terminará con un % símbolo.
La respuesta de Olivier Pirson es más clara que la que publiqué aquí originalmente (también maneja correctamente los archivos vacíos). Edité mi solución para que coincida con la suya.
En bash:
newline_at_eof()
{
    if [[ -s "$1" && -z "$(tail -c 1 "$1")" ]]
    then
        echo "Newline at end of file!"
    else
        echo "No newline at end of file!"
    fi
}
 
 Como un script de shell al que puede llamar (péguelo en un archivo, chmod +x <filename> para hacerlo ejecutable):
#!/bin/bash
if [[ -s "$1" && -z "$(tail -c 1 "$1")" ]]
then
    echo "Newline at end of file!"
else
    echo "No newline at end of file!"
fi
 
 El \Z meta-carácter significa el final absoluto de la cadena.
if (preg_match('#\n\Z#', file_get_contents('foo.txt'))) {
    echo 'New line found at the end';
}
 
 Así que aquí estás viendo una nueva línea al final absoluto de la cadena. file_get_contents no añadirá nada al final. PERO cargará todo el archivo en la memoria; si su archivo no es demasiado grande, está bien, de lo contrario tendrá que traer una nueva solución a su problema.