[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Динамически включать-выключать CPU



> >> > if printf "%s" "$1" | grep '^[1-9][0-9]*$' >/dev/null 2>&1
> >> > then :
> >> > else exit 1
> >> > fi
> >>
> >> Спасибо! К сожалению, расшифовать это мне не удалось. Каким образом
> >> оно упадёт, если в $1 _не только_ цифры?
> >
> > Если там не только цифры (причем начинающиеся не с 0) или даже пустая
> > строка, то регулярное выражение не удовлетворится, и grep завершится с
> > кодом 1.  А поскольку он последний, то это будет код завершения всего
> > pipeline, что после if.  Отсюда - ветка else, где exit 1.
> >
> > Или тебе чего расшифровать?  Регулярное выражение?
> 
> Оно понятно что это не здесь...
> 
> Ну не понимаю я регулярные выражения :( Впрочем, я вообще предпочитаю
> _читаемые_ языки. Из программистов в техписатели ушёл, когда C++ всех
> победил (Python тогда ещё не было, а Дельфи уже уходили).
>

Это как раз можно и здесь.  И вообще, регулярные выражения - это читаемый
язык.  Только почти не избыточный.

^ - начало строки.  Т.е. выражение, которое мы ищем, должно начинаться точно в
начале строки, а не в середине.

[1-9] - один символ от 1 до 9 в текущем символьном порядке.  Т.е. цифра от 1
до 9.

[0-9] - то же самое, но от 0 до 9.  Т.е. любая цифра.

* - предыдущее подвыражение должно матчиться любое количество раз, в том числе
нулевое. Предыдущим подвыражением в отсутствие скобок является выражение для
предыдущего символа, т.е. любая цифра.  Т.е. "любая цифра любое количество
раз".  Каждый раз любая, а не одна и та же.  Потому что выражение должно
повторно матчиться, а не отматченная строка повторяться.

$ - конец строки.

Итого, читая почти слева направо: в начале строки любая цифра от 1 до 9, потом
любое количество любых цифр, и на этом строка должна закончиться.  Твоя
питоновская проверка, надо сказать, хуже этой, потому что сожрет 0 и
отрицательные числа, а они на месте pid'а могут как-то интерпретироваться, в
разных местах по-разному.  В команде kill, например, если написать

kill 9 10

то процессам 9 и 10 будет послан SIGTERM (15), а если написать

kill -9 10

то процессу 10 будет послан SIGKILL (9).

> Однако спасибо - в данном случае просто заюзаем :)
> 
> > А вообще для программирования на шелле существует довольно надежный способ
> > ломаться - надо включить опцию -e, например, сказав не
> >
> > #!/bin/sh
> >
> > а
> >
> > #!/bin/sh -e
> >
> > Тогда любая команда, завершившаяся неудачно (кроме команд, стоящих в условии
> > if или перед ||) будет приводить к тому, что в этом месте скрипт и завершится.
> 
> Это да, но когда то, что требует в Питоне int(), в шелле требует
> regexp, а иначе даже не упадёт нормально, мне становится непросто :)

Ну, как я выше написал, питоновский int() ой, не обеспечивает нужной
проверки.  Его результат еще надо проверить на >0.  А ты это сделать забыл, а
зря.

Потом, понимаешь, int() - это очень частный случай.  Регекспы хороши тем, что
у них куда больше применений.  Например, когда я суммирую свои записи по
расходам в поездках, эти записи отбираются и парсятся именно ими, и я бы
задолбался описывать этот парсер (вместе с парсингом того, что не нужно, чтобы
только выкинуть) любым другим способом.  При этом выражения для парсинга не
принципиально сложнее вышеприведенного.

> > Intel - тоже Сильмарилл. Только сделанный не так...
> 
> Представил себе двухядерный Сильмарилл.

Судя по продолжительности свечения, ядер в Сильмарилле существенно больше двух
:-)

-- 
Intel - тоже Сильмарилл. Только сделанный не так...


Reply to: