/bin/bash вопрос по while read

Модератор: Модераторы разделов

apekoff
Сообщения: 25

/bin/bash вопрос по while read

Сообщение apekoff »

Всем привет!
Интересует вопрос по bash
начинаю только изучать
есть скрипт

Код: Выделить всё

#!/bin/bash
list1=/tmp/.list1
list2=/tmp/.list2

cat /etc/some_app/some_conf/* |  grep "full_Path" | cut  -d "\"" -f 2  > $list1
cat /etc/some_app/some_conf/* |  grep "Name"  | cut  -d "\"" -f 2  > $list2

cat $list1 | while read root_dir ;do
echo $root_dir
dirname=$(basename $root_dir)

cat $list2 | while read root_name ;do
echo $root_name
mkdir -p /tmp/data/$root_name/dumps/

touch /tmp/data/$root_name/dumps/$dirname.`date +%Y-%m-%d`.txt
done;
done;


По итогам этого скрипта хочется чтобы в в каждую папку $root_name создавался файлик dumps/$dirname.`date +%Y-%m-%d.txt
А выходит что в каждую папку $root_name создается файлы от всех $dirname
грубо говоря выглядит так -
/tmp/data/alex/dumps/alex.txt
/tmp/data/alex/dumps/jhon.txt
/tmp/data/alex/dumps/david.txt
А нужно чтоб выглядело так -
/tmp/data/alex/dumps/alex.txt
/tmp/data/jhon/dumps/jhon.txt
/tmp/data/david/dumps/david.txt
Спасибо.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: /bin/bash вопрос по while read

Сообщение SLEDopit »

Как всё сложно.
Я не знаю структуру /etc/some_app/some_conf/*
но предположим, что за каждым full_Path идёт ровно один Name ( если это не так, то код неверен )

Код: Выделить всё

grep "full_Path\|Name" /etc/some_app/some_conf/* | cut  -d "\"" -f 2 | sed 'N;s/\n/ /' | while root_dir rootname ; do
mkdir -p /tmp/data/$root_name/dumps/
touch /tmp/data/$root_name/dumps/$dirname.`date +%Y-%m-%d`.txt
done
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
apekoff
Сообщения: 25

Re: /bin/bash вопрос по while read

Сообщение apekoff »

не получается :(

Код: Выделить всё

#!/bin/bash
grep "DocumentRoot\|ServerName" /etc/apache2/sites-enabled/* | cut  -d "\"" -f 2 | sed 'N;s/\n/ /' | while root_dir root_name ; do
mkdir -p /tmp/data/$root_name/dumps/
touch /tmp/data/$root_name/dumps/$dirname.`date +%Y-%m-%d`.txt
done


Код: Выделить всё

scropt.sh: 2: scropt.sh: root_dir: not found
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: /bin/bash вопрос по while read

Сообщение SLEDopit »

я слово read пропустил. fixed:

Код: Выделить всё

grep "full_Path\|Name" /etc/some_app/some_conf/* | cut  -d "\"" -f 2 | sed 'N;s/\n/ /' | while read root_dir rootname ; do
mkdir -p /tmp/data/$root_name/dumps/
touch /tmp/data/$root_name/dumps/$dirname.`date +%Y-%m-%d`.txt
done

UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
apekoff
Сообщения: 25

Re: /bin/bash вопрос по while read

Сообщение apekoff »

SLEDopit писал(а):
28.11.2013 18:34
я слово read пропустил. fixed:

Код: Выделить всё

grep "full_Path\|Name" /etc/some_app/some_conf/* | cut  -d "\"" -f 2 | sed 'N;s/\n/ /' | while read root_dir root_name ; do
mkdir -p /tmp/data/$root_name/dumps/
touch /tmp/data/$root_name/dumps/$dirname.`date +%Y-%m-%d`.txt
done

эмм работает все!! почти. ., только почему то переопределены root_dir и root_name

Код: Выделить всё

grep "full_Path\|Name" /etc/some_app/some_conf/* | cut  -d "\"" -f 2 | sed 'N;s/\n/ /' | while read root_dir root_name ; do
mkdir -p /tmp/data/$root_name/dumps/
echo root_dir # ----->>>  тут выводится список root_name
touch /tmp/data/$root_name/dumps/$dirname.`date +%Y-%m-%d`.txt
done


Может ли это быть от того что в документах /etc/some_app/some_conf/* "Name" идет раньше чем "full_Path" ?
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: /bin/bash вопрос по while read

Сообщение SLEDopit »

apekoff писал(а):
28.11.2013 19:01
Может ли это быть от того что в документах /etc/some_app/some_conf/* "Name" идет раньше чем "full_Path" ?
да, скорее всего. впрочем, вы можете легко в этом убедиться, просто посмотрев файлы. (:
ну и пофиксить, собственно тоже просто: поменять их порядок, там где они читаются ( после read )
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
apekoff
Сообщения: 25

Re: /bin/bash вопрос по while read

Сообщение apekoff »

Код: Выделить всё

#!/bin/bash
grep "Name\|Path" /etc/some_app/some_conf/* | cut  -d "\"" -f 2 | sed 'N;s/\n/ /' | while read root_name root_dir ; do
dirname=$(basename $root_dir)
mkdir -p /tmp/data/$root_name/dumps/
mkdir -p /tmp/data/$root_name/backups/
cd $root_dir
cd ../
tar pc $dirname --exclude=.git | gzip -5 > /tmp/data/$root_name/backups/$dirname.`date +%Y-%m-%d`.bak.tar.gz


USERNAME='login'
HOSTNAME='ftp.com'
PASSWORD='pass'

ftp -n -i -p $HOSTNAME << EOF
        user $USERNAME $PASSWORD
        dir
        ascii
        mkdir $root_name
        mkdir $root_name/backups
        mkdir $root_name/dumps
        put /tmp/data/$root_name/backups/$dirname.`date +%Y-%m-%d`.bak.tar.gz /$root_name/backups/$dirname.`date +%Y-%m-%d`.bak.tar.gz
        quit
    EOF
exit 0
done

выбивает ошибку scropt.sh: 27: backup.sh: Syntax error: end of file unexpected (expecting "done") :angry:почему ?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: /bin/bash вопрос по while read

Сообщение drBatty »

apekoff писал(а):
29.11.2013 04:04
(expecting "done") angry.gifпочему ?

потому-что done пишется после do ..., и никак иначе. перед EOF не нужно пробелов, не нужно exit, да ещё и exit 0
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
apekoff
Сообщения: 25

Re: /bin/bash вопрос по while read

Сообщение apekoff »

ставлю "done" до подключения по фтп
как тогда ниже по коду передать текущие значения $root_name $dirname потому что после "done" значения обнуляются :(
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: /bin/bash вопрос по while read

Сообщение SLEDopit »

apekoff писал(а):
29.11.2013 04:04
mkdir -p /tmp/data/$root_name/dumps/
mkdir -p /tmp/data/$root_name/backups/
можно написать просто mkdir -p /tmp/data/$root_name/dumps/ /tmp/data/$root_name/backups/
apekoff писал(а):
29.11.2013 04:04
cd $root_dir
cd ../
можно написать просто cd $root_dir/../
apekoff писал(а):
29.11.2013 04:04
ftp -n -i -p $HOSTNAME << EOF
user $USERNAME $PASSWORD
dir
ascii
mkdir $root_name
mkdir $root_name/backups
mkdir $root_name/dumps
put /tmp/data/$root_name/backups/$dirname.`date +%Y-%m-%d`.bak.tar.gz /$root_name/backups/$dirname.`date +%Y-%m-%d`.bak.tar.gz
quit
EOF
Либо убрать все символы перед EOF в конце, либо между << EOF поставить - : <<-EOF . Тогда перед EOF в конце можно использовать табуляцию.

Код: Выделить всё

ftp -n -i -p $HOSTNAME <<EOF
        ...
EOF


Ну и как заметил drBatty, exit лишний.

А done он у вас просит, потому что пробелы перед EOF. И шелл считает, что то, что нужно скормить ftp ещё не закончилось. Если это исправить, скрипт нормально заработает.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
apekoff
Сообщения: 25

Re: /bin/bash вопрос по while read

Сообщение apekoff »

Спасибо большое все закрутилось :drinks: ! очень доступно объяснил !
Спасибо сказали: