Имеется bash-скрипт с sql-запросом к БД Oracle. При выполнении выдаётся ошибка, что верно, так как в запросе есть служебные символы. Как их корректно экранировать?
#!/bin/bash
HOST=db.local
MAILHEADER="Content-Type: text/html; charset=UTF-8; Importance: high X-Priority: 1 (Highest) X-MSMail-Priority: High"
MAILBODY="Хост: <b>$HOST</b><br>
Запрос: <b>пользователи</b><br>
Дата: <b>$(date)</b><br>
<br>"
SQL=`
sqlplus -s system/manager@DB << EOF
set linesize 3800
set pagesize 60
select distinct action from v$session where action like '%FRM%' order by action;
/
EOF
`
SQLOUTPUT="<pre>$SQL</pre>"
echo "$MAILBODY $SQLOUTPUT" | mail -s "$(hostname)" -a "$MAILHEADER" admin@mail.local
PS На правильный вопрос: зачем так, если проще сделать вызов sql-запроса из отдельного файла? Отвечу - чтобы не плодить кучу файлов и вызов происходил из одного места.
Уточнение.
Основной момент в этой части скрипта.
v$session не является переменной bash-скрипта, а является служебной таблицей БД.
SQL=`
sqlplus -s system/manager@DB << EOF
set linesize 3800
set pagesize 60
select distinct action from v$session where action like '%FRM%' order by action;
/
EOF
`
Добавление 2.
Получилось в таком варианте:
SQL=$(
sqlplus -s system/manager@DB << EOF
set linesize 3800
set pagesize 60
select distinct action from v\$session where action like '%FRM%' order by action;
/
EOF
)