Unix 쉘 스크립트에서 일련의 와일드카드 문자를 이스케이프 처리하는 방법은 무엇입니까?

Unix 쉘 스크립트에서 일련의 와일드카드 문자를 이스케이프 처리하는 방법은 무엇입니까?

Unix crontab에서 다음 Oracle SQL을 실행해야 합니다. 쿼리는 다음과 같습니다.

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:] ''`~!@#$%^&*-_{};":/.,<>?()]');

각 와일드카드 앞에 이스케이프 문자를 설정했지만 여전히 오류가 발생합니다. 그래서 먼저 개수를 선택하는 crontab을 작성했습니다. 하지만 계속해서 오류가 발생합니다. 내 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

내가 받은 오류는 다음과 같습니다.

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

Nothing to Worry

답변1

이 오류는 문제가 여기에 있음을 나타냅니다.

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

쉘은 이 백틱을 닫는 백틱으로 해석 COUNT=하고 나머지 행을 명령으로 실행하려고 시도합니다 ~!@#$%^&*-_{};":/.,<>?()]');.

이 시도:

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

$()구조는 일반적으로 더 안전하고 읽기 쉽습니다.

관련 정보