2015-01-13 3 views
0

Я имею странное поведение при попытке перебрать обычный текстовый файл:Как правильно печатать читать строки в Баше

#!/bin/bash 
sed -n "5,5p" test.tmp 
while read linea in 
do 
    echo $linea 
done < test.tmp 

Дело в том, что с первым СЭДОМ я получаю то, что я ожидал, но от цикл, пока я не:

./test.sh 
(5) Sorgo            DICOTILEDONEAS        1,5-2 l/ha   15 
(1) 
(2) 
(3) 
(4) 
(5) 
(6) 

Я прилагаю оба файла для того, чтобы помочь пониманию того, что происходит здесь:

Заранее спасибо

+0

МФС линии разделения на пробельных. Переопределите это, так что только ввод строки новой строки – albfan

+1

'echo $ linea', во-первых, добавляет большое количество ошибок по сравнению с' echo '$ linea "', или - намного лучше - 'printf'% s \ n '' $ linea «'. –

+0

Помимо этого, см. BashFAQ # 1 для всестороннего обсуждения правильного ввода данных: http://mywiki.wooledge.org/BashFAQ/001 –

ответ

0

я, наконец, нашел то, что происходит. Внутри while было добавлено дополнительное «in». Вероятно, я смешал два разных вида.

Где я был:

во время чтения Linea в сделать эхо $ Linea сделано < test.tmp

Должно быть:

во время чтения Linea; ## в удаленных и; добавил сделать эхо $ Linea сделано < test.tmp

Еще раз спасибо

2

Что бы я сделал:

#!/bin/bash 

while IFS= read -r linea; do 
    printf '%s\n' "$linea" 
done < <(sed -n "5,5p" test.tmp) 

< <() подмена процесс проверки
http://mywiki.wooledge.org/ProcessSubstitution
http://wiki.bash-hackers.org/syntax/expansion/proc_subst


"Двойная кавычка" каждый литерал, который содержит пробелы/метасимволы и каждое расширение: "$var", "$(command "$var")", "${array[@]}", "a & b". Используйте 'single quotes' для кода или литерала $'s: 'Costs $5 US', ssh host 'echo "$HOSTNAME"'. См
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words

+1

Нужно очистить 'IFS' и использовать аргумент' -r' для 'read' полностью точный. Как бы то ни было, эта полоса пропускает пробелы (или другие символы IFS) и обрабатывает последовательности обратного слэша в их ассоциированные символы. –

+1

Кроме того, 'printf '% s \ n' '$ linea" 'будет иметь меньше угловых случаев, чем' echo'; рассмотрите поведение с линией, содержащей только '-n'. –

+0

Возможно, вам стоит упомянуть, что делает '-', даже если это не требуется в этом случае. –

Смежные вопросы