2016-09-23 2 views
0

Я пытаюсь прочитать все строки файла и объединить их в строку. После погуглить экстенсивно, вот что у меня есть:Проблема с файлом чтения Bash и строкой построения

#!/bin/bash 

filename='file.txt' 
files='' 

while read p; do 
    files="$files $p" 
done < $filename 

echo $files 

Проблема заключается в том, что кажется, файлы переменной, кажется, чтобы получить перезаписаны каждый раз. Не следует ли это просто добавлять?

Пример file.txt:

test1 
test2 
test3 

Выход:

test2 

(Обратите внимание, что я intentially отправил это как есть - есть пространство перед словом test2 на выходе)

+1

Невозможно воспроизвести ... получение 'test1 test2 test3' – heemayl

+0

Просто используйте' files = $ (cat $ filename) '. –

+0

@heemayl Хм. Я нахожусь в Windows с помощью Git Bash. Добавлено точно, что я запускаю –

ответ

3

Ваш входной файл имеет окончания строки DOS и не заканчивается символом новой строки. Это означает, что значение файлов действительно test1\r test2\r. test3 никогда не добавляется, потому что последний вызов read, который устанавливает p в test3, имеет статус выхода 1, связанный с неспособностью найти окончательный символ новой строки.

Терминал рассматривает возврат каретки как инструкцию для перемещения курсора к началу строки, поэтому все, что следует за \r, перезаписывает все, что было ранее написано на линии.

Правильная вещь - это исправить свой входной файл, чтобы он соответствовал стандарту POSIX для текстовых файлов: все строки, включая последний, заканчиваются одним символом \n.

+0

Вы также можете взломать цикл, чтобы иметь дело с форматом DOS, с 'while IFS = $ '\ r' read p || [[-n "$ p"]]; do'. Параметр IFS заставит его обрезать конечные каретки (-ы), а предложение '||' продолжит цикл для последней строки (не правильно завершенной). –

1

Проблема в том, что ваш файл.txt имеет возврат каретки.

Чтобы проверить это, измените последнюю строку:

эхо $ файлов | cat -v