test: unknown operator

Автор B@F, 10 Января 2014, 09:04

« предыдущая тема - следующая тема »

0 Пользователей и 1 Гость просматривают эту тему.

B@F

10 Января 2014, 09:04 Последнее редактирование: 10 Января 2014, 09:07 от B@F
Всем привет.

Прошу вашей помощи товарищи. Имеется скрипт, который парсит текстовый файл и необходимое из него отправляет по 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 #####
и завершается с ошибкой.
Может как-то поможете советом или еще чем как этого избежать?
Поправьте, если я ошибаюсь, буду тока рад.

sotrud_nik

10 Января 2014, 09:26 #1 Последнее редактирование: 10 Января 2014, 09:32 от sotrud_nik
Зачем делать cat file | grep когда grep сам умеет в файл смотреть? А вдруг файл гигабайтных размеров, тогда скрипту будет нехорошо.

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

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

Хотя тут ожидется что grep выдаст число. Если например файл не найден то grep  выдаст текстовое сообщение об ошибке
которое поломает сравнение.
Но с другой стороны вначале нужно проверять наличие лог файла.

B@F

Цитата: 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 лучше делать, правильнее. Где-то в начале есть проверка на существование такого файла. Как изменю, не раньше понедельника, что бы на выходных работало, сразу отпишусь.
Поправьте, если я ошибаюсь, буду тока рад.

hedgeven

а зачем вам ввобще счетчик (grep -c)? разве не достаточно проверки простого наличия (grep -q)?

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