> >> > 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 - тоже Сильмарилл. Только сделанный не так... -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87obysnsgc.wl%...@ran.pp.ru