Для массы старенького своего заброшу.
На сервере одновременно работают несколько инстансов oracle разных версий. С ними надо производить однотипные рутинные операции – возникает вопрос, как определить ORACLE_HOME необходимый для работы с конкретной БД.
Подразумеваем, что listener.ora заполнен должным образом.
На вход подаем GLOBAL_DBNAME, на выходе имеем соответствующий ему ORACLE_HOME
DB_NAME=$1
for I in `ps -ex|awk '/[t]nslsnr/ {print $4":"$5}'`
do
L=`echo $I|cut -f2 -d":"`
P=`echo $I|sed 's|\(.*\)/bin/.*|\1|g'`/network/admin/listener.ora
ORACLE_HOME_TMP=`paste -s $P | tr -d " \t" | sed 's/.*SID_LIST_'"$L"'=(SID_LIST=\(.*)))\).*/\1/g' | sed 's/))(/))\
(/g' | grep "=$DB_NAME)" | sed 's/.*(ORACLE_HOME=\([^)]*\)).*/\1/'`
[ ".$ORACLE_HOME_TMP" != "." ]&&export ORACLE_HOME=$ORACLE_HOME_TMP
done
ВНИМАНИЕ!!! Перенос строки с sed обязателен!