====== BASH - Files - Read a file - Troubleshooting - Files lack their final newlines ======
===== My text files are broken! They lack their final newlines! =====
If there are some characters after the last line in the file (or to put it differently, if the last line is not terminated by a newline character), then **read** will read it but return false, leaving the broken partial line in the read variable(s).
You can process this after the loop:
# Emulate cat.
while IFS= read -r line; do
printf '%s\n' "$line"
done < "$file"
[[ -n $line ]] && printf %s "$line"
or:
# This does not work:
printf 'line 1\ntruncated line 2' | while read -r line; do echo $line; done
# This does not work either:
printf 'line 1\ntruncated line 2' | while read -r line; do echo "$line"; done; [[ $line ]] && echo -n "$line"
# This works:
printf 'line 1\ntruncated line 2' | { while read -r line; do echo "$line"; done; [[ $line ]] && echo "$line"; }
**NOTE:**
The first example, beyond missing the after-loop test, is also missing quotes.
----
Alternatively, you can simply add a logical OR to the while test:
while IFS= read -r line || [[ -n $line ]]; do
printf '%s\n' "$line"
done < "$file"
printf 'line 1\ntruncated line 2' | while read -r line || [[ -n $line ]]; do echo "$line"; done
----