Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / shell script проблема с read / 6 сообщений из 6, страница 1 из 1
13.07.2006, 11:00:25
    #33850129
Castor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell script проблема с read
Привет!
возникла необходимость сравнить таблички с одинаковыми именами в БД Oracle (в разных схемах). Решил сделать это с помощью shell'а.
Имена таблиц для сравнения храню в файле inp:

Код: plaintext
1.
2.
3.
4.
5.
ARAGREEMENT
.
.
.
SCHEDULES
SCHEDULECONTEXT

сам скрипт выглядит следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
#!/bin/ksh

# checing table exist 

chktabsexist()
{
#echo $ 1 
v_x=$ 1 
#echo 'inp in query = ' | read $ 1 
sqlplus -s icttstb/icttstb <<!EOF
select 'result: ',count (*) from dba_tables 
where table_name like '%ARAGREEMENT'  and owner=UPPER('AR_OGS');
exit
!EOF
}

# reading inp file
procrec()
{
  while read inp
  do
    let i=i+ 1 
    var[$i]=$inp
    echo 'var in while = ' ${var[$i]}
    echo 'From while. inp = ' $inp
    chktabsexist $inp | grep "result:" | read xdummy oae_count
    echo 'QTY is ' $oae_count
  done	
}


cat inp | grep -v "<>" | procrec  


exit  0 

процедура procrec() - считывает построчно файл inp .
процедура chktabsexist() - проверяет имеется ли таблица (имя мы как раз из inp считываем) в заданной схеме (сейчас там просто жестко задано условие where table_name like '%ARAGREEMENT' , но должно быть что-то вроде where table_name like '$1' ).

Проблема состоит в том, чтобы вернуть результат работы chktabsexist() в procrec() . Если вызов chktabsexist() , оставить как есть
Код: plaintext
chktabsexist $inp | grep "result:" | read xdummy oae_count
, то процесс вообще не попадает в chktabsexist() . chktabsexist() отрабатывает только в том случае, если закомментировать read в вызове
Код: plaintext
chktabsexist $inp | grep "result:" #| read xdummy oae_count

Думаю что это из-за того что один read, вызывается внутри другого (в цикле).
Как вариант, думаю использовать массив, в который в одном цикле будут считываться имена таблиц, а в другом, все это дело обрабатываться. Только не знаю как сделать, чтобы при переходе выполнения от одной процедуры к другой, значения переменных этого массива не терялись.

------------
На злобу дня
...
Рейтинг: 0 / 0
13.07.2006, 12:10:47
    #33850414
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell script проблема с read
Castor
read внутри read не виновата. Она вполне реентерабеьна, если можно так выразиться :-)
на самом деле даже если read не закомментировано - Ваша функция выполняется chktabsexist которая
Просто теряется ее вывод.
Переменные тоже не заполнятся - для эксперимента попробуйте так


chktabsexist $inp | grep "result:" | while read xdummy oae_count; do echo "xdummy=$xdummy oae_count=$oae_count"; done


увидите, что они на самом деле заполняются :-) Но потом при выходе из блока Вы их потеряете.

Я бы сделал просто по другому

set `chktabsexist $inp | grep "result:"`
xdummy=$1
oae_count=$2
...
Рейтинг: 0 / 0
13.07.2006, 12:26:37
    #33850483
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell script проблема с read
или если очень хочется read - то можно через here document

Код: plaintext
1.
2.
3.
read xdummy oae_count << EEE
`chktabsexist $inp | grep "result:"`
EEE
...
Рейтинг: 0 / 0
13.07.2006, 17:24:41
    #33851942
Castor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell script проблема с read
--null-- , спасибо!
Сделал как Вы рекомендовали, работает:
Код: plaintext
1.
2.
set `chktabsexist $inp | grep "result:"`
xdummy=$ 1 
oae_count=$ 2 


а если делать так:

Код: plaintext
1.
2.
read xdummy oae_count << EEE
`chktabsexist $inp | grep "result:"`
EEE

то ругается на "<<"
syntax error at line 29 : `<<' unmatched
------------
На злобу дня
...
Рейтинг: 0 / 0
13.07.2006, 18:12:53
    #33852144
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell script проблема с read
да.
странно, что ругается на <<
я даже в Korn Shell специально -попробовал - работает, в том числе в контексте такого как раз скрипта, внутри цикла while read.
Хрен с ним конечно, однако странно.
Обычно ругается here document <label> unclosed, если закрыть забыли, но здесь вроде все нормально.
...
Рейтинг: 0 / 0
13.07.2006, 19:31:50
    #33852319
Castor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell script проблема с read
да, странно. В chktabsexist() такая конструкция работает.
...
Рейтинг: 0 / 0
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / shell script проблема с read / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]