LINUX.ORG.RU

bash тройные вложенные кавычки


0

1

Всю голову сломал, но так и не придумал как решить проблему :)

В таком варианте всё работает хорошо:

SSH="ssh -p 22 srv78"
CMD="$SSH 'source $ENVIRON; echo \"select value from v\\\$parameter ;\" | sqlplus -s / as sysdba'"
echo $CMD
su - oracle -c "$CMD"

однако стоит добавить внутрь запроса условие WHERE с уловием в кавычках - работать напрочь отказывается... Как уже только не экранировал внутренние кавычки...

SSH="ssh -p 22 srv78"
CMD="$SSH 'source $ENVIRON; echo \"select value from v\\\$parameter WHERE name=\'control_files\' ;\" | sqlplus -s / as sysdba'"
echo $CMD
su - oracle -c "$CMD"

Буду очень благодарен, если кто-то подскажет в какую сторону копать...

★★

COND = "name='control_files'"
CMD="$SSH 'source $ENVIRON; echo \"select value from v\\\$parameter WHERE $COND ;\" | sqlplus -s / as sysdba'"
monk ★★★★★
()
Ответ на: комментарий от monk

Так от не видит кавычки в условии:

select value from v$parameter name=control_files
                                  *
ERROR at line 1:
ORA-00933: SQL command not properly ended

qqqq ★★
() автор топика

Ты даже не попытался описать задачу, а начал сходу описывать свои фантазии на тему её решения.
Нельзя так, не по-людячьи это как-то

zolden ★★★★★
()

Давай подумаем. Первое экранирование снимется интерпретатором при подстановке в команду. Второе при выполнении команды echo. Третье уже будет при обработке запроса. Значит, чтобы кавычка попала в запрос, ее нужно дважды экранировать - как знак доллара. Получается, надо вместо name='control_files' писать name=\\\'control_files\\\'. Для отладки перенаправь вывод в файл вместо sqlplus.

Kiborg ★★★
()
Ответ на: комментарий от zolden

ну, как её описать...

Первые кавычки - это блок команд для SSH, (переменные окружения; SQL запрос) Вторые кавычки - для SQL запроса Третие - для условия WHERE

Вроде бы типовая задача, наверняка кто-то решал подобное...

qqqq ★★
() автор топика
Ответ на: комментарий от Kiborg

Да, я так тоже пробовал, но вот какой результат. Код с тройным экранирование выглядит так:

SSH="ssh -p 22 srv78"
CMD="$SSH 'source $ENVIRON; echo \"select value from v\\\$parameter WHERE name=\\\'control_files\\\' ;\" | sqlplus -s / as sysdba'"
echo $CMD
su - oracle -c "$CMD"

вывод echo $CMD

ssh -p 22 srv78 'source /home/oracle/HCNV12/db.env; echo "select value from v\$parameter WHERE name=\\'control_files\\' ;" | sqlplus -s / as sysdba'

и дальше sqlplus

select value from v$parameter WHERE name=\control_files\
                                         *
ERROR at line 1:
ORA-00911: invalid character

вот такие дела...

Я уж тут думал что может в скобки какой-то блок захватить?...

qqqq ★★
() автор топика

одинарные кавычки не экранируются \
используй \\"

teod0r ★★★★★
()
Ответ на: комментарий от Kiborg

Вот это да! Ни за что бы не догадался, действительно работает! чтобы резюмировать, рабойчий вариант скрипта:

SSH="ssh -p 22 srv78"
CMD="$SSH 'source $ENVIRON; echo \"select value from v\\\$parameter WHERE name='\''control_files'\'' ;\" | sqlplus -s / as sysdba'"
echo $CMD
su - oracle -c "$CMD"

Большое спасибо! :)

qqqq ★★
() автор топика

По частям проще:

`id -u` != 0 || exec su oracle -c "$0" || exit
ssh srv78 "source $ENVIRON; sqlplus -s / as sysdba" <<END
select value from v\$parameter 
  WHERE name='control_files';
exit
END
DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.