Качать обязательно!
Сам каст можно найти здесь.
Ни дня на месте, только вперед!
Качать обязательно!
Сам каст можно найти здесь.
На сутки (до 23:00 по москве 27 марта) выкладываю запись второго каста с нашего тренинга.
Он посвящен, догадайтесь чему? Правильно — shell!
Содержимое каста:
1.Базовые понятия
1.Раскрытие переменных / подстановки в /bin/sh
1.переменные/присвоение/арифметические операции
2. ”, “”, без кавычек
3. “
4. ;
5. :
2.Операторы shell
1.команды сравнения (test, []), -eq, -ne, -ge, -le, -gt, -lt, -a, -o, -f, -d, -s, -z, =, !=, >, <, ()
2.if/while/for
1. if [ ]
2. if command
3. while , while read, white read <<EOF
4. for VAR in “
3.Домашнее задание
Калькулятор -
Код:
> ./accum Enter Acc: 10 Accumulator value is 10 Enter operation: * 5 Accumulator value is 50 Enter operation: - 12 Accumulator value is 38 Enter operation: / 2 Accumulator value is 19 q Quitting >
Линк на запись с тренинга по shell программированию - будет жить сутки, потом умрет
UPDATE: линк умер
зато есть бонус
Все кандидаты на вылетание — их набралось аж целых шестеро, были сегодня отчислены за невыполненное первое домашнее задание.
Жаль конечно, но видимо на этот раз нам не по пути.
Увидимся в следующий раз
Для новичков в shell программировании
Несколько приемов для того, чтоб сделать свои скрипты компактнее, быстрее и правильней:
1. Упрощение конструкции с if
Конструкцию
if команда1
then
команда2
fi
можно заменить просто на команда1 && команда2
2. Упрощение конструкции с if !
Конструкцию
if ! команда1
then
команда2
fi
можно заменить просто на команда1 || команда2
3. Если вы используете шаблоны или подстановку аргументов в shell
Если вы используете шаблоны (скажем, *) или подстановку аргументов в shell при помощи “, то если их много shell не может сделать такую подстановку. Тогда стоит прибегнуть к помощи команды xargs.
Т.е. строчка
rm * в директории, которая содержит слишком много файлов, может превратиться в
ls | xargs rm
Или же
rm `find ./ -name pkg-descr` может превратиться в
find ./ -name pkg-descr | xargs rm
4. Ускорить grep
Если вы ищите какую-то строку в больший объемах данных при помощи grep, то стоит использовать fgrep — который позволяет искать только вхождения строк, а не регулярных выражений — но и работает быстрее на 10-20%.
5. Пишем условия правильно
Для того, чтоб при проверке условий не появлялось бы ошибок при неправильном пользовательском вводе, скажем если INPUT пустая строка
if [ $INPUT = test ]; then … fi
то стоит применять либо вариант с дописыванием одного символа с обоих сторон сравнения
if [ x$INPUT = xtest ]; then … fi
либо брать переменную в двойные кавычки
if [ "$INPUT" = test ]; then … fi
6. Чтоб не дать команде выводить что-либо на экран
Можно использовать перенаправление стандартного вывода и стандартного потока ошибок в /dev/null
ping -c foo.bar > /dev/null 2>/dev/null
После этого уже можно проверять код завершения этой программы.
7.Осторожно фильтруем список выполняемых команд
Если вы из скрипта хотите отослать сигнал завершения или какой-либо другой группе команд и используете для этого строчку типа
kill -9 `ps -ax | grep PROCESS_NAME | cut -c1-5 `
то вы случайно можете убить и процесс grep и получить неправильные результаты. Поэтому обязательно переписывайте такие команды вот так:
kill -9 `ps -ax | grep PROCESS_NAME | grep -v grep | cut -c1-5`
Это исключит саму команду grep из списка убиваемых процессов.
Подробный план кастов такой. Отписывайтесь, комментируйте
Базовые понятия (45-50 минут)
Раскрытие переменных / подстановки (15 мин)
переменные/присвоение/арифметические операции
‘, “”, без кавычек
“
;
:
Операторы shell
команды сравнения (test, []), -eq, -ne, -ge, -le, -gt, -lt, -a, -o, -f, -d, -s, -z, =, !=, >, <, () (10 мин)
if/while/for (15 мин)
if [ ]
if command
цикл while , while read, white read <<EOF
цикл for VAR in “
Домашнее задание (5-10 мин)
простейший калькулятор
на 4 — учитывать неправильный ввод в калькуляторе
на 4 — рисовать график
на 5 — рисовать график функций и оси координат
Ввод-вывод (55-60 минут)
Ответ на Д/З, общие ошибки/вопросы (15 минут)
Новый материал
перенаправление ввода-вывода (10 минут),
>, >>, <. <<
как группировать стандартный вывод нескольких команд (5 минут), subshell
субшелл — (cmd; cmd)
чтение переменных
присвоение переменных
cmd | субшелл | cmd | cmd
какие подводные камни при использовании subshell (10-15 минут)
( субшелл ) & - остающиеся процессы
команда read использование в цикле (5 минут)
cmd | while read …
подмена IFS
отдать д/з — (10 минут)
простейший аналог newsyslog (читать/парсить файл) — на 3
на 4 — реализовать нормальную ротацию файлов (с посылкой сигналов)
на 5 — лимит на количество файлов в ротации
Дополнительные материалы (55 минут)
Ответ на Д/З, общие ошибки/вопросы (20 минут)
команда case (15 мин)
как эмулировать grep/cut и так далее
команда eval (10 мин)
как эмулировать массивы
как эмулировать ассоциативные массивы
д/з (10 минут)
выводить информацию о пользователе из /etc/passwd
на 5 — решить задачу (выбирать несколько колонок — подробное описание в файле)
Ответ на Д/З, общие ошибки/вопросы (15-20 минут)
разбор sed (20 минут)
адресация строк (/xxx/, /xxx/…/xxx/, !/xxx/)
команды sed (p, d, s)
как комбинировать команды sed
д/з (10 минут)
анализ лог файла — получить список наиболее посещаемых URL
анализ лог файла — получить top 10 ссылающихся URL
программирование на awk (45 минут)
Ответ на Д/З, общие ошибки/вопросы (15 минут)
разбор awk (20 минут)
блоки команд, BEGIN, END
адресация полей в строке
условия выполнения, адресация строк, условия
переменные
вывод информации
д/з (10 минут)
на 3 — фильтрация логов
на 4 — подсчет статистики по логам
на 5 — ротация вывода команды cal (аналог ncal)
Заключительный (35 минут)
Ответ на вопросы (20 минут)
What’s next (15 минут)
какие книжки стоит почитать
какие вещи стоит попытаться автоматизировать в системе сначала?
Какие признаки задач, которые НЕ решаются на shell за разумное время?
Бонус - пока не скажу, но что-то вкусное (25 минут)
По программированию на shell существует много пособий и учебников, но в этой статье я хотел бы поговорить о нескольких приемах, которые часто либо не используются, либо воспринимаются неправильно. Особенно это касается новичков в shell программировании
1. Создание lock файла
Очень часто нужно бывает выполнять скрипт, который может делать непредсказуемые вещи, если его запустить параллельно. Особенно часто это бывает, когда скрипт запускается из cron, а предыдущий его экземпляр не успел завершиться.
Вот пример скрипта, который создает lock файл, и если он присутствует — то вылетает с ошибкой.
| Код: |
| #!/bin/sh LOCKFILE=/tmp/mylockif [ ! –s $LOCKFILE ]; then # проверяем, что lock файл пустой echo $$ > $LOCKFILE # записываем идентификатор процесса в lock файл # все действия скрипта нужно поместить здесь : > $LOCKFILE # обнуляем lock файл exit 0 else # как пример — отсылаем почту root, из-за того, # что не скрипт не может быть запущен echo “PID `cat $LOCKFILE` running” | mailx –s “$0 can’t run” root exit 1 fi |
Этот скрипт можно переписать, чтоб он пытался бы запуститься несколько раз с паузами (просто добавить while и sleep), либо чтоб он убивал бы ранее запущенный скрипт, если тот выполняется более N секунд.
2. ВСЕГДА проверяйте коды возврата
Всегда проверяйте, какой код возврата вам выдала запущенная вами программа или скрипт — так как это может повлиять на дальнейшую работу вашего скрипта. В /bin/sh код возврата находится в переменной $? .
3.Используйте код возврата
Вы можете проанализировать код возврата при помощи команды test (используя ее в виде квадратных скобок [ ] ) и выполнить правильную последовательность действий
| Код: |
| if [ “$?” -eq ‘0’ ]; then echo ‘Я зиданчег’; else echo ‘Я не зиданчег’; fi |
Не забывайте, что в shell положительный код возврата это 0, а все оставшиеся коды — это сообщение об ошибках.
Можно сразу передавать команды оператору if, а не анализировать код выхода, сохраненный в $?.
| Код: |
| host=’127.0.0.1′ if ping -c 1 $host; then echo ‘Хост пингуецца’; else echo ‘Хост совсем неживой’; fi |
4. Объединение вывода команд
Можно объединять вывод нескольких команд вместе. Вместо того, чтоб добавлять вывод нескольких команд в один и тот-же файл, можно использовать subshell — дочерний shell.
| Код: |
| #!/bin/sh ( echo ‘———————–’ cat /etc/motd echo ‘———————–’ cat /etc/issue echo ‘———————–’ ) > /tmp/motd-issue |
5.Другие приемы с subshell
При выполнении цепочки команд может быть очень полезным сперва поменять директорию, а потом только выполнять команду. Вот как это делается
| Код: |
| tar cf - . | (cd /tmp/test && tar xpf -) |
Если директории /tmp/test не существует, то и вторая команда tar не будет выполнена.
6.Запуск куска кода в фоновом режиме
Если вам нужно запустить кусок кода в фоновом режиме, то тоже можно использовать subshell
| Код: |
| #!/bin/sh echo ‘begin’ (echo ’subshell start’; sleep 5; echo ’subshell stop’)& echo ‘end’ |
Кусочек кода (echo ’subshell start’; sleep 5; echo ’subshell stop’) будет выполняться в фоновом режиме до тех пор, пока не завершиться.
7.Использование команд через ssh
Есть огромное количество ситуаций, когда очень удобно пересылать данные и команды через ssh. Например, чтоб скопировать файлы и директории с одного компьютера на другой:
| Код: |
| tar cf - ./dir | ssh $host “cd /dir/ && tar xpf –“ |
Или как вариант, запустить скрипт на удаленном хосте, не копируя его туда:
| Код: |
| cat script.sh | ssh $host /bin/sh |
Те, кто не отписались во-время
Такова жизнь, товарищи, пролетаете с тренингом, как фанера над парижем. Ибо нужно было отписываться во-время - были 1 сутки времени.
И еще — шустрый товарищ с ником ‘ilyouha‘ тоже пролетает со свистом, потому что в посте с анонсом тренинга он не отписывался а почему то решил сразу полезть на форум. направляется в жестокий бан.
Если сумеете выполнить эти 3 условия до 23:00 по москве 23 марта - отлично, вписываетесь на тренинг. Не успеваете — значит на не по пути.
Базовые понятия (45-50 минут) (24 марта)
Раскрытие переменных / подстановки (15 мин)
Операторы shell
Домашнее задание
Ввод-вывод (55-60 минут) (25 марта)
Ответ на Д/З, общие ошибки/вопросы (15 минут)
Новый материал
перенаправление ввода-вывода и все такое
Домашнее задание
Дополнительные материалы (55 минут) (26 марта)
Ответ на Д/З, общие ошибки/вопросы
команда case
команда eval
Домашнее задание
Ответ на Д/З, общие ошибки/вопросы
разбор sed
Домашнее задание
программирование на awk (45 минут) (28 марта)
Ответ на Д/З, общие ошибки/вопросы
разбор awk
Домашнее задание
Заключительный (35 минут) (29 марта)
Качаем аудио файл, слушаем, выполняем домашнее задание.
Кто не успел отписаться до 24:00 по москве, 21 марта, пятница — тот пролетел с тренингом
Отписываемся на форуме здесь.
Как и обещал запись каста
Каст качаем здесь (3.5mb).
Отписываемся по задачам - что было бы интересно послушать
Многие не любят писать скрипты на shell, объясняя тем, что это сложно, что это требует много времени, что shell — слишком тупой и на нем невозможно написать что-то сложное и так далее. В действительности это не так. Поэтому я собрал список наиболее часто встречающихся проблем, с которыми сталкиваются пользователи, только начавшие работать с shell и программировать на нем. Сказанное верно для /bin/sh и совместимых с ним.
Непонимание механизма, как shell запускает команды, как происходит открытие и подстановка данных командной строки
Непонимание того, как раскрываются переменные в одинарных кавычках, в двойных кавычках и без кавычек
Непонимание механизма работы подстановка “
Непонимание того, как работает перенаправление (>, >>, <, <<)
Нечеткое понимание того, как работает pipe, как команды связываются в цепочки команд
Как можно группировать команды друг с другом, как запускаются дочерние процессы в shell и когда они завершаются. Как при этом происходит присвоение переменных — и почему не всегда оно срабатывает?
Плохое владение awk и sed, которые многократно расширяют возможности shell.
Неуверенное владение командой test (она же [ ] ) для проверки условий
Незнание всех тонкостей работы команд управления выполнением — if/case/while/for
Отсутствие навыков по комбинированию команд shell друг с другом.
Это список тех ошибок, с которыми я сталкивался на своей практике.
Если у вас есть какие-то предложения, какие ошибки бывают у новичков в Unix — отписывайтесь, чтоб я мог бы включить их в программу своего тренинга по shell программированию. Тренинг начнется 24 марта, поэтому запись проблена со 24-го числа!
Кстати, именно с ними мы и будем бороться, пока будет идти тренинг.
Пишите свои предложения!