Linux Forum Казахстан

Дистрибутивы => Другие Linux-ы и Unix-ы => Тема начата: B@F от 10 Января 2014, 09:04

Название: test: unknown operator
Отправлено: B@F от 10 Января 2014, 09:04
Всем привет.

Прошу вашей помощи товарищи. Имеется скрипт, который парсит текстовый файл и необходимое из него отправляет по ftp. Вот вырезка
[spoiler]       touch $HOME/$LOCK_FILE
        for hostnm in `cat $ftphostsfile`;
        do
                if [ `cat $HOME/$CUR_DATA_FILE | grep '#####'` ] ; then
                        DebugMsg "Detected SBROS in EMS-XDM"
                        break   
                fi
                cat $HOME/$CUR_DATA_FILE | grep -v 2M | sed 's/EMS/EMS-XDM/' >> "alarm_$hostnm.dat"
                cat $HOME/$CUR_DATA_FILE | sed 's/EMS/EMS-XDM/' >> "alarm_SDH.log"
                if [ $? != 0 ]; then
                        ErrorMsg "Can't append file alarm_$hostnm.dat"
                        exit
                fi
        done
        /bin/rm $HOME/$CUR_DATA_FILE
        /bin/rm $HOME/$LOCK_FILE
  fi
[/spoiler]
Когда скрипт выполняет это  if [ `cat $HOME/$CUR_DATA_FILE | grep '#####'` ] ; then и находит в нем только одну строчку с #####, то он действует так как этого и нужно. Но бывают косяки и в файле появляются несколько строчек с #####, в этом случаи скрипт выдает
/opt/XDM/sh/ftpSend_V8_03: test: unknown operator #####
и завершается с ошибкой.
Может как-то поможете советом или еще чем как этого избежать?
Название: Re: test: unknown operator
Отправлено: sotrud_nik от 10 Января 2014, 09:26
Зачем делать cat file | grep когда grep сам умеет в файл смотреть? А вдруг файл гигабайтных размеров, тогда скрипту будет нехорошо.

Как вариант сделать

if [ $(grep -c '#####' $HOME/$CUR_DATA_FILE) -gt 1 ] ; then

Хотя тут ожидется что grep выдаст число. Если например файл не найден то grep  выдаст текстовое сообщение об ошибке
которое поломает сравнение.
Но с другой стороны вначале нужно проверять наличие лог файла.
Название: Re: test: unknown operator
Отправлено: B@F от 10 Января 2014, 09:59
Цитата: sotrud_nik от 10 Января 2014, 09:26if [ $(grep -c '#####' $HOME/$CUR_DATA_FILE) -gt 1 ] ; then

ЦитироватьЦЕЛОЕ1 -ge ЦЕЛОЕ2
ЦЕЛОЕ1 больше или равно ЦЕЛОЕ2
ЦЕЛОЕ1 -gt ЦЕЛОЕ2
ЦЕЛОЕ1 больше ЦЕЛОЕ2

Спасибо я думаю -ge мне больше подойдет. Это реально косяк моего корявого кода. Обсолютно верно сразу grep лучше делать, правильнее. Где-то в начале есть проверка на существование такого файла. Как изменю, не раньше понедельника, что бы на выходных работало, сразу отпишусь.
Название: Re: test: unknown operator
Отправлено: hedgeven от 10 Января 2014, 10:38
а зачем вам ввобще счетчик (grep -c)? разве не достаточно проверки простого наличия (grep -q)?

т.е.
if `grep -q '#####' $HOME/$CUR_DATA_FILE`; then  echo 'тырым-пырым'; esle echo 'пырым-тырым'; fi