Como escapar de um conjunto de curingas no script de shell unix?

1

Eu preciso executar o seguinte Oracle SQL no crontab unix. A consulta é a seguinte:

select count(*)
from tbaadm.htd
where cust_id is not null and
pstd_flg = 'Y' and
del_flg = 'N' and
tran_date =  (select db_stat_date-1 from tbaadm.gct) and
REGEXP_LIKE(tran_particular,'[^[:alnum:] '''~!@#$%^&*-_{};":/.,<>?()]');

Eu configurei caracteres de escape antes de cada caractere curinga, mas ainda estou recebendo um erro. Então eu escrevi o crontab onde eu seleciono a contagem primeiro. Mas estou recebendo erro de novo e de novo. A seguir estão os conteúdos relevantes do meu crontab:

. $HOME/.profile

function dbconstants
{
USER="user"
PASS="password"
MAIL_BODY_PATH="/home/admin/CRONTAB_SHELL/"
MAIL_BODY=$MAIL_BODY_PATH"mail.txt"
}

function checkcount
{
COUNT='sqlplus -s $USER/$PASS@proddb <<EOF
#connect $USER/$PASS@proddb;
set pagesize 0
SET ESCAPE '\'
select count(*)
from tbaadm.htd
where cust_id is not null and
pstd_flg = 'Y' and
del_flg = 'N' and
tran_date =  (select db_stat_date-1 from tbaadm.gct) and
REGEXP_LIKE(tran_particular,'[^[:alnum:] \'\'\'\~\!\@\#\$\%\^\&\*\-\_\{\}\;\"\:\/\.\,\<\>\?\(\)\]\'\)\;
EOF'
echo $COUNT
echo $COUNT | sed 's/^[ \t]*//;s/[ \t]*$//' |& read -p COUNT1
}
function fetchdetails
{
'sqlplus -s $USER/$PASS@finratna <<EOF >$MAIL_BODY
set feed off pages 0 trimspool on
set pagesize 60
set linesize 9999
set trim on
set head off
SET ESCAPE '\'
alter session set nls_date_format='DD-MM-YYYY';
select tran_date|| '|,' ||tran_id|| '|,' ||part_tran_srl_num|| '|,' ||tran_particular|| '|,' ||REGEXP_REPLACE
(tran_particular,'[^[:alnum:] ''\'~!@#$%^&*-_{};":/.,<>?()]','') reg_par
from tbaadm.htd
where cust_id is not null and
pstd_flg = 'Y' and
del_flg = 'N' and
tran_date =  (select db_stat_date-1 from tbaadm.gct) and
REGEXP_LIKE(tran_particular,'[^[:alnum:] ''\'~!@#$%^&*-_{};":/.,<>?()]');
EOF'
}
function deletefile
{
        rm -f $MAIL_BODY
}

dbconstants
checkcount
if [ "$COUNT" -gt 0 ]
then
fetchdetails
else
echo "Nothing to Worry"
fi

deletefile

O erro que estou recebendo é:

checkcount[13]: ~!@#$%^&*-_{};":/.,<>?()]');:  not found.

Nothing to Worry
    
por Mistu4u 23.02.2016 / 16:24

1 resposta

1

O erro indica que o problema está aqui:

REGEXP_LIKE(tran_particular,'[^[:alnum:] \'\'\'\~\!\@\#\$\%\^\&\*\-\_\{\}\;\"\:\/\.\,\<\>\?\(\)\]\'\)\;
                                              ^

O shell interpreta este backquote como fechando o em COUNT= , e tenta executar o restante da linha como um comando, ~!@#$%^&*-_{};":/.,<>?()]'); .

Tente isto:

COUNT=$(sqlplus -s $USER/$PASS@proddb <<EOF
<snip>
EOF
)

A construção $() é geralmente mais segura (e mais fácil de ler).

    
por 23.02.2016 / 22:03