Archive for the 'Unix/FreeBSD' Category

Shell programming: отжиг на тему шелл :)

Качать обязательно!

Сам каст можно найти здесь.

Shell programming: на десерт

На сутки (до 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 programming - все кандидаты — вылетели

Все кандидаты на вылетание — их набралось аж целых шестеро,  были сегодня отчислены за невыполненное первое домашнее задание.

Жаль конечно, но видимо на этот раз нам не по пути.

Увидимся в следующий раз :)

7 способов улучшить ваши shell скрипты на /bin/sh

Для новичков в 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 из списка убиваемых процессов.

Shell programming: подробный план кастов

Подробный план кастов такой. Отписывайтесь, комментируйте :)

     

  1. Базовые понятия (45-50 минут)

    1. Раскрытие переменных / подстановки (15 мин)

      1. переменные/присвоение/арифметические операции

      2. ‘, “”, без кавычек

      3. ;

      4. :

    2. Операторы shell

      1. команды сравнения (test, []), -eq, -ne, -ge, -le, -gt, -lt, -a, -o, -f, -d, -s, -z, =, !=, >, <, () (10 мин)

      2. if/while/for (15 мин)

        1. if [ ]

        2. if command

        3. цикл while , while read, white read <<EOF

        4. цикл for VAR in “

    3. Домашнее задание (5-10 мин)

      1. простейший калькулятор

      2. на 4 — учитывать неправильный ввод в калькуляторе

      3. на 4 — рисовать график

      4. на 5 — рисовать график функций и оси координат

  2. Ввод-вывод (55-60 минут)

    1. Ответ на Д/З, общие ошибки/вопросы (15 минут)

    2. Новый материал

      1. перенаправление ввода-вывода (10 минут),

        1. >, >>, <. <<

      2. как группировать стандартный вывод нескольких команд (5 минут), subshell

        1. субшелл — (cmd; cmd)

        2. чтение переменных

        3. присвоение переменных

        4. cmd | субшелл | cmd | cmd

        5. какие подводные камни при использовании subshell (10-15 минут)

        6. ( субшелл ) & - остающиеся процессы

      3. команда read использование в цикле (5 минут)

        1. cmd | while read …

        2. подмена IFS

      4. отдать д/з — (10 минут)

        1. простейший аналог newsyslog (читать/парсить файл) — на 3

        2. на 4 — реализовать нормальную ротацию файлов (с посылкой сигналов)

        3. на 5 — лимит на количество файлов в ротации

  3. Дополнительные материалы (55 минут)

    1. Ответ на Д/З, общие ошибки/вопросы (20 минут)

    2. команда case (15 мин)

      1. как эмулировать grep/cut и так далее

    3. команда eval (10 мин)

      1. как эмулировать массивы

      2. как эмулировать ассоциативные массивы

    4. д/з (10 минут)

      1. выводить информацию о пользователе из /etc/passwd

      2. на 5 — решить задачу (выбирать несколько колонок — подробное описание в файле)

  4. программирование на sed (45-50 минут)
    1. Ответ на Д/З, общие ошибки/вопросы (15-20 минут)

    2. разбор sed (20 минут)

      1. адресация строк (/xxx/, /xxx/…/xxx/, !/xxx/)

      2. команды sed (p, d, s)

      3. как комбинировать команды sed

    3. д/з (10 минут)

      1. анализ лог файла — получить список наиболее посещаемых URL

      2. анализ лог файла — получить top 10 ссылающихся URL

  5. программирование на awk (45 минут)

    1. Ответ на Д/З, общие ошибки/вопросы (15 минут)

    2. разбор awk (20 минут)

      1. блоки команд, BEGIN, END

      2. адресация полей в строке

      3. условия выполнения, адресация строк, условия

      4. переменные

      5. вывод информации

    3. д/з (10 минут)

      1. на 3 — фильтрация логов

      2. на 4 — подсчет статистики по логам

      3. на 5 — ротация вывода команды cal (аналог ncal)

  6. Заключительный (35 минут)

    1. Ответ на вопросы (20 минут)

    2. What’s next (15 минут)

      1. какие книжки стоит почитать

      2. какие вещи стоит попытаться автоматизировать в системе сначала?

      3. Какие признаки задач, которые НЕ решаются на shell за разумное время?

  7. Бонус - пока не скажу, но что-то вкусное (25 минут)

7 примеров хитрого использования shell

По программированию на 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

Курс по shell программинг - бай-бай отстающие + план

Те, кто не отписались во-время

  • DiV
  • Алексей
  • rozhkov

Такова жизнь, товарищи, пролетаете с тренингом, как фанера над парижем. Ибо нужно было отписываться во-время - были 1 сутки времени.
И еще — шустрый товарищ с ником ‘ilyouha‘ тоже пролетает со свистом, потому что в посте с анонсом тренинга он не отписывался а почему то решил сразу полезть на форум. направляется в жестокий бан.

Итого на курс освободилось еще 3 2 1 бесплатное место.

Что нужно сделать для записи?

  1. Выполняете условия записи на тренинг, ставите отзыв.
  2. Отписываетесь в комментах к этой теме
  3. Регистрируетесь на форуме
  4. Качаете и слушаете каст.
  5. В комментах к ЭТОЙ же записи отписываетесь с ответами на следующие вопросы: (у вас должно получиться 9 ответов)
    • Зачем вы пришли на этот тренинг? Ваша цель
    • Что вы ожидаете от этого тренинга? Что вы хотите получить.
    • Что вы хотите решить, обучаясь на этом тренинге? Какая задача вас вынудила обучаться/записываться на тренинг.

Если сумеете выполнить эти 3 условия до 23:00 по москве 23 марта - отлично, вписываетесь на тренинг. Не успеваете — значит на не по пути.

План путина тренинга

  1. Базовые понятия (45-50 минут) (24 марта)

    1. Раскрытие переменных / подстановки (15 мин)

    2. Операторы shell

    3. Домашнее задание

  2. Ввод-вывод (55-60 минут) (25 марта)

    1. Ответ на Д/З, общие ошибки/вопросы (15 минут)

    2. Новый материал

      1. перенаправление ввода-вывода и все такое

    3. Домашнее задание

  3. Дополнительные материалы (55 минут) (26 марта)

    1. Ответ на Д/З, общие ошибки/вопросы

    2. команда case

    3. команда eval

    4. Домашнее задание

  4. программирование на sed (45-50 минут) (27 марта)
    1. Ответ на Д/З, общие ошибки/вопросы

    2. разбор sed

    3. Домашнее задание

  1. программирование на awk (45 минут) (28 марта)

    1. Ответ на Д/З, общие ошибки/вопросы

    2. разбор awk

    3. Домашнее задание

  2. Заключительный (35 минут) (29 марта)

  3. Бонусы (30-31 марта)

Shell programming: первое мини-домашнее задание

Качаем аудио файл, слушаем, выполняем домашнее задание.

Кто не успел отписаться до 24:00 по москве, 21 марта, пятница — тот пролетел с тренингом :)

Отписываемся на форуме здесь.

Запись сегодняшнего каста по shell programming

Как и обещал запись каста :)

Каст качаем здесь (3.5mb).

Отписываемся по задачам - что было бы интересно послушать :)

10 ошибок программиста на shell

Многие не любят писать скрипты на shell, объясняя тем, что это сложно, что это требует много времени, что shell — слишком тупой и на нем невозможно написать что-то сложное и так далее. В действительности это не так. Поэтому я собрал список наиболее часто встречающихся проблем, с которыми сталкиваются пользователи, только начавшие работать с shell и программировать на нем. Сказанное верно для /bin/sh и совместимых с ним.

  1. Непонимание механизма, как shell запускает команды, как происходит открытие и подстановка данных командной строки

  2. Непонимание того, как раскрываются переменные в одинарных кавычках, в двойных кавычках и без кавычек

  3. Непонимание механизма работы подстановка “

  4. Непонимание того, как работает перенаправление (>, >>, <, <<)

  5. Нечеткое понимание того, как работает pipe, как команды связываются в цепочки команд

  6. Как можно группировать команды друг с другом, как запускаются дочерние процессы в shell и когда они завершаются. Как при этом происходит присвоение переменных — и почему не всегда оно срабатывает?

  7. Плохое владение awk и sed, которые многократно расширяют возможности shell.

  8. Неуверенное владение командой test (она же [ ] ) для проверки условий

  9. Незнание всех тонкостей работы команд управления выполнением — if/case/while/for

  10. Отсутствие навыков по комбинированию команд shell друг с другом.

 

Это список тех ошибок, с которыми я сталкивался на своей практике.

Если у вас есть какие-то предложения, какие ошибки бывают у новичков в Unix — отписывайтесь, чтоб я мог бы включить их в программу своего тренинга по shell программированию. Тренинг начнется 24 марта, поэтому запись проблена со 24-го числа!

Кстати, именно с ними мы и будем бороться, пока будет идти тренинг.

Пишите свои предложения!




Анонс книги: Использование Shell с нуля и до профи!