Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование в *nix (http://forum.oszone.net/forumdisplay.php?f=35)
-   -   [решено] Построчное чтение файла в Bash (http://forum.oszone.net/showthread.php?t=172566)

FATruden 08-04-2010 13:50 1387910

Построчное чтение файла в Bash
 
Подскажите пожалуйста как мне сделать следующее в баше:
Есть файл (file.txt) к примеру с таким содержиммым
/var/dir
/usr/lical/dir
/root/dir
...

Необходимо что бы считывалась первая строчка и записывалась в переменную к примеру var1
затем считывалась вторая строчка и присваевалась переменной var2 и так до конца файла...

Просьба ответить кодом) с увожением Александр..

BuGfiX 08-04-2010 14:09 1387924

Не оно ?
Код:

cat file.txt | while read line
do
 echo $line
done


FATruden 08-04-2010 15:56 1388017

Вот! Именно эта конструкция мне и нужна только прблемма в том что я не могу разобрать как она работает??
если вы представите более подробные комментарии буду очень благодарен!

BuGfiX 08-04-2010 16:49 1388058

Я не хочу отправлять в google, но все-таки советую почитать что-нибудь по bash, например вот это.
Вкратце, по-русски :
cat выводит собержимое файла, оператор while через пайп получает вывод команды cat, построчно его читает оператором read в переменную line и печатает эту переменную на экран командой echo.

FATruden 08-04-2010 17:55 1388105

Нет нет я не прошу курс молодого бойца) я все это знаю просто пишу на bashe не часто а такого в практике еще не было....но за вежливость спасибо)

я просто хочу понять как данная конструкция работает!

получается что сначала первая строка записывается в переменную var1 и выводится на экране
потм вторая строка записывается в туже переменную var1 и выводится на экран
и так до конца файла?? я правельно понемаю?

BuGfiX 08-04-2010 18:00 1388108

да, верно

FATruden 08-04-2010 18:34 1388130

А если перед записью в переменную нового значения(например второй строки) мне нужно выполнить с ней некоторые операции например копирование в эту директорию или удоление то мне необходимо

cat file.txt | while read line
do
echo $line
cp /filename.txt $line
done

так можно на сколько я понемаю?

а если мне нужно выполнить с каждой строчкой разный! набор операций как быть тогда?

BuGfiX 08-04-2010 20:01 1388201

Цитата:

Цитата FATruden
а если мне нужно выполнить с каждой строчкой разный! набор операций как быть тогда? »

Как-то так:
Код:

cat file.txt | while read dirname
do
  case $dirname in
    "/root/dir")
      f="/filename.txt"
      ;;
    "/var/dir")
      f="/filename2.txt"
      ;;
    *)
      f="/filename3.txt"
  esac
  cp -v  $f $dirname/
done


FATruden 08-04-2010 21:22 1388245

Спасибо большое BuGfiX, теперь разобрался)

Тема закрыта.

BlackAndrew 28-09-2012 12:21 1996046

Цитата:

Цитата BuGfiX
cat file.txt | while read dirname
do
case $dirname in
"/root/dir")
f="/filename.txt"
;;
"/var/dir")
f="/filename2.txt"
;;
*)
f="/filename3.txt"
esac
cp -v $f $dirname/
done
»

Код работает, но... после прочтения всего файла, продолжается считывание уже пустых (несуществующих) строк.
Это у меня только такое?

vlad001 06-03-2017 20:13 2717247

А вот такая ситуация, есть файл в каждой строке которого числовое значение, их 4-е (значений). Нужно из этого файла считать эти значения построчно и присваивать их переменой поочерёдно. Но нужно это делать в цикле от 1 до 4-х, т.е. цикл посчитал 1 - чтение первой переменой из файла, цикл посчитал 2 - чтение второй и т.д. до 4-х. Вариант с while read line считывает сразу все 4-е переменные в первом цикле, а не по одной. Например, есть простая конструкция типа:
Код:

for I in 1 2 3 4; do
...
done

Вот внутрь тела этой конструкции внедрить описанное.

Ardenen 19-05-2017 00:44 2737917

vlad001,
В таком случае нужно использовать массив, а не переменную. И cat с пайпом не нужен, файл можно стрелкой в цикл читать:
Код:

while read -a line
do
    echo "Первое значение: ${line[0]}"
    echo "Второе значение: ${line[1]}"
  # и т.д.
done < file.txt



Время: 18:56.

Время: 18:56.
© OSzone.net 2001-