2015-06-10 2 views
0

У меня есть следующий сценарий оболочки, который выполняет SQL-запрос и команду, которая отправляет результат в виде электронной почты. Проблема в том, что я могу отправить только вывод SQL. Не выход цикла for. Я попытался дать «EOF» после цикла for, но затем он дает синтаксическую ошибку. Пожалуйста, дайте мне знать, как отправить оба вывода в электронном письме.Вывод SQL-запроса и команды в файл в сценарии оболочки

Благодарности & С уважением, Akhil

#!/bin/bash 
source $HOME/.bash_profile 

cd /home/cron 

wfVAR="red blue green" 


echo " " > /home/cron/output.lst 
sqlplus -s user/[email protected] <<EOF 
set linesize 55 pages 500 
spool output_temp.lst; 
set head off; 
select sysdate from dual; 
set head on; 
spool off; 
EOF 

for name in ${wfVAR}; do 
    pmcmd getworkflowdetails -sv REPOSITORY ${name} | grep -e "Workflow:" -e "Workflow run status:" -e "End time:" 
done 

sed -e 's/ *$//' output_temp.lst > output.lst 
cat /home/cron/output.lst | mail -s "Output - `date '+%d-%m-%y'`" [email protected] 
rm output_temp.lst 
+0

Как в стороне, в каталоге редко возникает необходимость в 'cd', и выполнение сценария зависит от' .bash_profile 'вызывающего пользователя, обычно не является хорошей идеей. И как всегда, 'cat file | mail' лучше выражен 'mail <файл'. – tripleee

+0

Вы не создаете 'output_temp.lst', и вы не записываете вывод из' sqlplus' или 'pmcmd'. – tripleee

ответ

1

Вы перезаписывать файл.

echo moo >output.lst 
echo bar >output.lst 

Теперь output.lst содержит только bar.

Трюк заключается в том, чтобы добавить вместо перезаписи.

У вашего сценария есть несколько дополнительных проблем, поэтому на самом деле не совсем понятно, что вы на самом деле хотите сделать. Я предполагаю что-то вроде этого.

sql things >output.lst 
for var in things; do stuff; done | sed 's/ *$//' >>output.lst 

... который по совпадению также может быть сделан с одним перенаправлением, если вы хотите, запустив команды в субоболочке и перенаправление вывода из субоболочки:

(sql things 
    for var in things; do stuff; done | sed 's/ *$//') >output.lst 

С этими размышлениями , весь ваш скрипт может быть

#!/bin/bash 
# source $HOME/.bash_profile ######## XXX probably don't do this 

output=/home/cron/output.lst 

sqlplus -s user/[email protected] <<EOF >$output # Capture output from SQL 
set linesize 55 pages 500 
spool output_temp.lst; 
set head off; 
select sysdate from dual; 
set head on; 
spool off; 
EOF 

for name in red blue green; do 
    pmcmd getworkflowdetails -sv REPOSITORY "$name" 
done | 
grep -e "Workflow:" -e "Workflow run status:" -e "End time:" | 
# XXX: could benefit from refactoring grep x | sed y to just sed '/x/!d;y' 
sed -e 's/ *$//' >> $output 
# XXX: fixed Useless Use of cat Award 
mail -s "Output - `date '+%d-%m-%y'`" [email protected] <$output 

Даже если вы хотите, можно было бы оставить постоянный выходной файл; просто труба до mail.

#!/bin/bash 

(sqlplus -s user/[email protected] <<__EOF 
    set linesize 55 pages 500 
    spool output_temp.lst; 
    set head off; 
    select sysdate from dual; 
    set head on; 
    spool off; 
__EOF 

    for name in red blue green; do 
    pmcmd getworkflowdetails -sv REPOSITORY "$name" 
    done | 
    sed -e '/Workflow:\|Workflow run status:\|End time:/!d' -e 's/ *$//') | 

mail -s "Output - `date '+%d-%m-%y'`" [email protected] 

(... Если предположить, что sed понимает \| означает чередование в регулярном выражении).

+0

Hi Tripleee, проблема заключается только в выходе SQL в электронном письме. Я хочу, чтобы выход цикла for также находился в том же файле. – Nair

+0

Ответ на это и объясняет, почему ваш код был неправильным. Но код, который вы опубликовали, не ведет себя так, как вы описываете. Мы можем только предположить, что то, что вы разместили, - это не совсем тот код, который вы используете, или какие-то детали, о которых вы нам не говорите (например, если код выполняется заданием cron, которое отправляет электронное письмо своего стандарта выход и стандартная ошибка). – tripleee

+0

Спасибо, Тройной, он сработал. Раньше я не выполнил код, который вы написали. Ценю вашу помощь. – Nair

Смежные вопросы