Синтаксическая ошибка в строке 1: `('не ожидается

Поскольку я новичок в Unix, может кто-нибудь помочь, почему я получаю эту ошибку?

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

Используемый сервер Unix: имя сервера AIX 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 ответ

Скобки являются специальными для оболочки. Ваш скрипт SQL содержит круглые скобки, которые вы не хотите обрабатывать оболочкой. Однако оболочка обрабатывает все не заключенные в кавычки скобки. Следовательно, вы можете использовать кавычки для предотвращения интерпретации скобок в вашем 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Значение содержит любые пробелы.)

Другие вопросы по тегам