[bourne shell] Построчное чтение, перенаправление и грабли

Mar 14, 2010 17:12

Вероятно, многие знают, что при помощи shell built-in read можно построчно читать всякое; особенно это актуально при считывании списка файлов, которые потенциально могут содержать пробелы (например, в выдаче ls или find) или чего-то подобного. Обычно это делается так:

Построчное чтение из файла:
while read line
do
# code
done < file

Построчное ( Read more... )

программирование, shell

Leave a comment

Comments 4

_winnie March 15 2010, 09:45:22 UTC
баш клёвый и простой, пока стыкуешь готовые программы :)

в питоне есть i += 1, но вместо него используют zip/enumerate.
Можно попробвать так же. Попробовал paste <(seq) <(ls), но к сожалению paste печатает наиболее длинный столбец а не наиболее короткий.

Запихнул вывод ls как параметр seq. Потерял параллельность выполнения.
(paste <(seq 1 $(ls |wc -l)) <(ls))

Попытался после вывода распечатать количество строк (конечный echo $i). Опять фейл,
(paste <(seq 1 $(ls |wc -l)) <(ls)) | tee >(wc -l)
tee: /dev/fd/63: Bad file descriptor

ИМХО, когда надо знать инструмент очень тонко - значит используется не тот инструмент.
В контексте баша - можно юзать awk или его современного конкурента, python :)
ls | awk '{print NR, $0} END {print "counter at the end:", NR}'

Reply

esyr March 15 2010, 10:27:01 UTC
Ну, собственно, я awk и использую для text processing в других местах. Шелл как раз и нужен, чтобы что-то повызывать на основе внимательного рассматривания строчек (в этом качестве с ним ни питон, ни awk не сравнится).

Reply


gq March 18 2010, 21:39:18 UTC
если сабшелл должен изменить только одну переменную - то в бэктики его. Еще можно по разному играться с потоками, могу показать код из продакшна.

Reply


hadsok September 18 2011, 18:03:54 UTC
Это интересно. Подскажите, где я могу об этом прочитать?

Reply


Leave a comment

Up