第1行的语法错误:`('不是预期的

时间:2017-04-07 13:30:42

标签: shell unix sqlplus ksh quoting

由于我是Unix的新手,有人可以帮我解决这个错误吗?

Error: 0403-057 Syntax error at line 1 : `(' is not expected

使用的Unix服务器:AIX servname 1 6 00F635064C00

使用的脚本(如果前天源文件未到达,则发送电子邮件警报):

#!/usr/bin/ksh

count=$(sqlplus $PROD_DB @select count(*) from file_audit where (file_name like '%abc%' or file_name like '%dce%') and substr(file_name,17,8)=to_char(to_date(sysdate-2,'DD/MM/YY'), 'yyyymmdd') > asa_file_count.log)

daybefore=`TZ=aaa48 date +%d-%m-%Y`

if [[ $count -lt 20 ]]
then
echo "Alert - Source files are yet to be received for date: $daybefore" | mail -s "Alert : Source data files missing" s@g.com
fi

1 个答案:

答案 0 :(得分:2)

圆括号是shell的特殊之处。您的SQL脚本包含您不希望shell处理的括号。但是,shell处理所有未引用的括号。因此,您可以使用引号来防止SQL对括号进行解释:

count=$(sqlplus $PROD_DB "@select count(*) from file_audit where (file_name like '%abc%' or file_name like '%dce%') and substr(file_name,17,8)=to_char(to_date(sysdate-2,'DD/MM/YY'), 'yyyymmdd')" > asa_file_count.log)
#                        ^ and similarly, a closing quote at the end, just before  ">asa_file..." .

现在,还有第二个问题:你有

count=$(sqlplus ... > asa_file_count.log)

但是,我认为这意味着count将始终为空,因为计数将进入asa_file_count.log,并且无法使用$()捕获。我相信删除>asa_file_count.log可能会做你想要的事情:

count=$(sqlplus "$PROD_DB" "<your query>")

(我还在$PROD_DB附近加上双引号,以防PROD_DB的值包含任何空格。)