powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / shell script проблема с read
6 сообщений из 6, страница 1 из 1
shell script проблема с read
    #33850129
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!
возникла необходимость сравнить таблички с одинаковыми именами в БД 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
shell script проблема с read
    #33850414
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
shell script проблема с read
    #33850483
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или если очень хочется read - то можно через here document

Код: plaintext
1.
2.
3.
read xdummy oae_count << EEE
`chktabsexist $inp | grep "result:"`
EEE
...
Рейтинг: 0 / 0
shell script проблема с read
    #33851942
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--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
shell script проблема с read
    #33852144
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да.
странно, что ругается на <<
я даже в Korn Shell специально -попробовал - работает, в том числе в контексте такого как раз скрипта, внутри цикла while read.
Хрен с ним конечно, однако странно.
Обычно ругается here document <label> unclosed, если закрыть забыли, но здесь вроде все нормально.
...
Рейтинг: 0 / 0
shell script проблема с read
    #33852319
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, странно. В chktabsexist() такая конструкция работает.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / shell script проблема с read
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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