Код завершения и конструкция вида if

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
sedikpoll
Сообщения: 100

Код завершения и конструкция вида if

Сообщение sedikpoll »

Есть сценарий который заканчивается следующим выражением:

Код: Выделить всё

...|sort|uniq -c|sort -n|grep -iE "3 abc"

т.е. я сортирую выражения и выбираю нужно если оно есть. Хочу прекрутить визуальное уведомление если такое выражение было найдено, сам код уведомления:

Код: Выделить всё

xmessage -button ok -center 3 abc

Мы знаем что если grep находит вхождения то его код завершения равен 0. Если я правильно понимаю логику то полностью выражение должно выглядить следующим образом:

Код: Выделить всё

...|sort|uniq -c|sort -n|grep -iE "3 abc"; if [ что то == 0 ] then xmessage -button ok -center 3 abc; fi

Но не совсем понимаю как именно нужно указать сам код возврата. Подскажите, пожалуйста, что именно в моем случаи нужно указывать в [ ].

Но так же у меня закрались подозрение что такое решение вообще верно т.к. код завершение будет для всего выражения сразу, а не для часто которая будет находится до if.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20796
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Код завершения и конструкция вида if

Сообщение Bizdelnick »

sedikpoll писал(а):
17.05.2013 00:55
что именно в моем случаи нужно указывать в [ ].

[ $? -eq 0 ]
А можно вместо ; if ... написать && xmessage ...
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2660
ОС: Gentoo

Re: Код завершения и конструкция вида if

Сообщение ormorph »

Так же можно вывод направить в переменную
а затем проверить пустая или нет.
if [ -n "$ABC" ] ; then xmessage -button ok -center 3 abc;fi

Либо в кавычках само выражение в место переменной, в $(...)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Код завершения и конструкция вида if

Сообщение SLEDopit »

sedikpoll писал(а):
17.05.2013 00:55
т.к. код завершение будет для всего выражения сразу, а не для часто которая будет находится до if.
нет, там будет код завершения именно grep'а. даже если sort споткнётся, а grep вернёт 0, то !? будет 0.

Код: Выделить всё

 $ echo 12 | cat - cat ; echo $?
12
cat: cat: No such file or directory
1

 $ echo 12 | cat - cat | grep 1 ; echo $?
cat: cat: No such file or directory
12
0
в bash для таких случае есть PIPESTATUS:

Код: Выделить всё

 $ echo 12 | cat - cat | grep 1 ; echo ${PIPESTATUS[*]}
cat: cat: No such file or directory
12
0 1 0
ну или можно включить pipefail, который выключен по умолчанию. Но оно тогда просто вернёт не 0, если кто-то в цепочке завалился. PIPESTATUS круче (:

Код: Выделить всё

set -o pipefail

зы. и, кстати, в данном случае, похоже, выхлоп от grep вас совершенно не интересует, поэтому его можно отключить опицей -q.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2660
ОС: Gentoo

Re: Код завершения и конструкция вида if

Сообщение ormorph »

Только похоже для PIPESTATUS нужно еще выполнять проверку наличия команд.

Код: Выделить всё

$ echo 12|cac|sort ; echo ${PIPESTATUS[*]}


Спасибо сказали:
Ответить