Автор Тема: test: unknown operator  (Прочитано 1213 раз)

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

Оффлайн B@F

  • Доброй души человек, если кого обижу то пишите мне, я не специально.
  • Administrator
  • Свой человек
  • *****
  • Сообщений: 1277
  • Karma: +7/-0
    • linuxforum.kz
  • Jabber: baf@xmpp.kz
test: unknown operator
« : 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 #####и завершается с ошибкой.
Может как-то поможете советом или еще чем как этого избежать?
« Последнее редактирование: 10 Январь 2014, 09:07 от B@F »
Поправьте, если я ошибаюсь, буду тока рад.

Оффлайн sotrud_nik

  • Модераторы
  • Свой человек
  • *****
  • Сообщений: 683
  • Karma: +9/-0
    • baurzhan.info
Re: test: unknown operator
« Ответ #1 : 10 Январь 2014, 09:26 »
Зачем делать cat file | grep когда grep сам умеет в файл смотреть? А вдруг файл гигабайтных размеров, тогда скрипту будет нехорошо.

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

if [ $(grep -c '#####' $HOME/$CUR_DATA_FILE) -gt 1 ] ; then
Хотя тут ожидется что grep выдаст число. Если например файл не найден то grep  выдаст текстовое сообщение об ошибке
которое поломает сравнение.
Но с другой стороны вначале нужно проверять наличие лог файла.
« Последнее редактирование: 10 Январь 2014, 09:32 от sotrud_nik »

Оффлайн B@F

  • Доброй души человек, если кого обижу то пишите мне, я не специально.
  • Administrator
  • Свой человек
  • *****
  • Сообщений: 1277
  • Karma: +7/-0
    • linuxforum.kz
  • Jabber: baf@xmpp.kz
Re: test: unknown operator
« Ответ #2 : 10 Январь 2014, 09:59 »
if [ $(grep -c '#####' $HOME/$CUR_DATA_FILE) -gt 1 ] ; then
Цитировать (выделенное)
ЦЕЛОЕ1 -ge ЦЕЛОЕ2
 ЦЕЛОЕ1 больше или равно ЦЕЛОЕ2
ЦЕЛОЕ1 -gt ЦЕЛОЕ2
 ЦЕЛОЕ1 больше ЦЕЛОЕ2
Спасибо я думаю -ge мне больше подойдет. Это реально косяк моего корявого кода. Обсолютно верно сразу grep лучше делать, правильнее. Где-то в начале есть проверка на существование такого файла. Как изменю, не раньше понедельника, что бы на выходных работало, сразу отпишусь.
Поправьте, если я ошибаюсь, буду тока рад.

Оффлайн hedgeven

  • Administrator
  • Свой человек
  • *****
  • Сообщений: 853
  • Karma: +13/-0
  • Jabber: hedgeven@xmpp.kz
Re: test: unknown operator
« Ответ #3 : 10 Январь 2014, 10:38 »
а зачем вам ввобще счетчик (grep -c)? разве не достаточно проверки простого наличия (grep -q)?

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

 

Соц. сети

Вконтакте - linuxforum.kz Вконтакте - LinuxCenter.kZ

СПО в Казахстане

LinuxCenter.kZ Jabber сервер XMPP.kz Baurzhan.info

Прочее

nmgames.kz radio.north.kz