tail -c 1
выводит последний символ (, точнее, последний байт )своего ввода.
Подстановка команд удаляет завершающий символ новой строки, поэтому $(tail -c 1 <…)
является пустым , если последний символ файла является новой строкой. Он также пуст, если последний символ является нулевым байтом (в большинстве оболочек ), но текстовые файлы не имеют нулевых байтов.
Имейте в виду, что пустой файл не нуждается в дополнительной новой строке.
if [ ! -s "$filename" ]; then
echo "$filename is empty"
elif [ -z "$(tail -c 1 <"$filename")" ]; then
echo "$filename ends with a newline or with a null byte"
else
echo "$filename does not end with a newline nor with a null byte"
fi