LinuxForum.Fans
Тема

BASH: while read

Автор: cy6erGn0m 5 сообщений 4254 просмотров
#103641

Простая казалось бы задача, а что-то всё не выходит сделать нормально.

Задача: найти в файле строчку с версией указанного компонента и записать в переменную

файл имеет формат
${component_name} version: ${version}

Как ни кручу, а всё не выходит никак обработать, потому что while read не позволяет вывести ничего за пределы самого цикла
Например, цикл
export B=HELLO

text

while read -r LINE; do
        echo $LINE;
        export B=$LINE
done < $A | grep 'COMPONENT version'
echo $B

На самом деле не делает ничего.. печатает LINE, но в B ничего не записывет

Если сделать просто for in `cat $A | grep 'COMPONENT version'`.... то он будет выдавать строки по частям... т.е. COMPONENT отдельно, потом на следующей итерации цикла будет слово version, а сама версия уже в следующий раз...

Неужели такая простейшая вещь не делается никак?

#103643

Вообще-то, я упрости задачу. Именно в такой формулировке есть workaround:

text

B=$(cat $A | grep 'COMPONENT version' | cut -d : -f2 | awk '{print $1}')

Но если бы внутри цикла потребовались более сложные манипуляции, то выходит, что никак не обой...

#103647
cy6erGn0m написал:
Неужели такая простейшая вещь не делается никак?

легко.
причём как минимум пятью способами.
дайте наконец тестовый файл, и что вы хотите получить на выходе.

#103650
cy6erGn0m написал:
Но если бы внутри цикла потребовались более сложные манипуляции, то выходит, что никак не обой...

могу дать намёк (могу и решение, но за $$ ;) )
[console]doc@dt:~$ ll /dev/fd/
итого 0
lrwx------ 1 doc users 64 2010-12-01 18:02 0 -> /dev/pts/0
lrwx------ 1 doc users 64 2010-12-01 18:02 1 -> /dev/pts/0
lrwx------ 1 doc users 64 2010-12-01 18:02 2 -> /dev/pts/0
lr-x------ 1 doc users 64 2010-12-01 18:02 3 -> /proc/1972/fd/
[/console]

#103652

Тестовый файл:
MyComponent1 version: 3.18.4_1
MyComponent2 version: 3.18.4_2
MyComponent3 version: 3.18.4_3

На выходе хочется получить, например, "3.18.4_2" зная имя компоненты.

Войдите или зарегистрируйтесь, чтобы ответить.