Вы безоговорочно добавляете новую строку с назначением string="$string""$line""$newline"
.
read
возвращает значение true, если оно успешно считывает строку, включая символ новой строки.Проверка того, содержит ли $line
что-либо, имеет дело с возможным последним фрагментом строки.Но когда вы его обрабатываете, вам нужно , а не добавить символ новой строки, поскольку его там не было с самого начала.Пока нет окончательного фрагмента строки, ваш скрипт работает нормально.
Вероятно, это легче всего исправить, переместив тест [ -n "$line" ]
за пределы цикла:
#!/bin/sh
newline='
'
string=
while IFS= read -r line; do
string="$string$line$newline"
done < "$1"
if [ "$line" ]; then
string="$string$line"
fi
echo "<$string>" # markers for clarity
Конечно, это также можетбудь то, что входной файл имеет только полные строки, а дополнительный символ новой строки - это то, что печатает echo
.Используйте printf "%s" "$string"
, чтобы напечатать только содержимое переменной, без новой строки или чего-либо еще.У некоторых оболочек есть echo -n
, чтобы запретить заключительный перевод строки, но это нестандартно.