Tag Archive for 'shell'

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

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 - самое самое начало тренинга :)

Я решил провести этот тренинг в более интерактивном формате, ем предыдущие :)
Поэтому

  • Вам нужны будут наушники/динамики, чтоб меня слушать ;)
  • Детали о вещании и обратной связи - читаем http://forum.gasparchilingarov.com/index.php/topic,52.0.html
  • Затягиваем пояса и морально готовимся к касту :)
  • Запись каста будет, после того, как я ее обработаю.
  • Начинаете регистрироваться на форуме! ( http://forum.gasparchilingarov.com/ )!
  • Вам нужно заготовить хоть какой-то вариант unix shell (не из семейства *csh, а что-то типа sh, bash, kzh, zsh)
    Основной упор будет делаться на FreeBSD /bin/sh, но в принципе с маленькими изменениями должно работать и в других оболочках.
  • Мазохисты могут попытаться работать с Cygwin эмулятором оболочки — и причем доволно успешно (там используется bash).

Все вопросы — задавайте в комментариях к этому посту :)

ПРОБНЫЙ КАСТ — в 21:00 по Москве 20 марта. Чем больше вас подключится — тем лучше :) Проверим мой канал связи :)

Программирование на Shell

Набор прекращен, НО - читайте дальше!

Освободилось 3 2 1 БЕСПЛАТНОЕ место. Можете вписаться, подробности здесь.


Как научится программировать на shell ?

  • Вы пользуетесь Unix системами?

  • Вы хотите получить лучше оплачиваемую работу unix админа?
  • Вы хотите сэкономить свое время и деньги?
  • Вы хотите работать эффективней в Unix среде?
  • Вы хотите научиться программировать на shell и использовать shell на все 100% процентов?

Если Ваш ответ - «Да, я хочу знать больше!» — Вы попали ТОЧНО по адресу! Программирование на shell - это в реальности ОЧЕНЬ просто!

Записывайтесь на БЕСПЛАТНЫЙ тренинг по программированию на /bin/sh в среде Unix!

Предложение в силе до 19 марта 2008 , после этого стоимость тренинга в коробочной версии будеет 6000р.

Бесплатно впишутся только ПЕРВЫЕ 20 человек!

Если не впишетесь до 19 марта - то тогда вы сумеете его купить только в коробочной версии вместе с другими тренингами за цену не ниже 6000р.
Тренинг закрытый и его материалы не будут выкладываться в публичном доступе. Я буду проводить этот тренинг ровно ОДИН раз.

На тренинге будут обязательные домашние задания. Те кто не успеет их выполнить — будут отчислены.

На кого рассчитан курс?

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

Вы должны хотя бы уметь:

  • запускать команды
  • знать, где искать команды в Unix
  • создавать/редактировать файлы
  • менять права доступа к файлам
  • умение читать man странички

Обязательно скачайте, прочитайте и послушайте бесплатные подкасты/материалы ОТСЮДА .

Программа курса

У вас должно быть базовое знакомство с шелл ! Предварительно скачайте бесплатные материалы по FreeBSD shell .

Что вы НАУЧИТЕСЬ делать:

  • перенаправление ввода-вывода
  • понимание как работает фоновый запуск команд
  • как группировать стандартный вывод нескольких команд
  • как писать скрипты shell, if/циклы/другие команды shell
  • как организовывать проверки
  • полезные приемы при написании скриптов
  • программирование на awk
  • программирование на sed

Будет много вкусных домашних заданий. КАКИЕ — не скажу, но буду отжигать ;)

Что нужно сделать, чтоб попасть на курс?

Для получения доступа на курс вам всего-лишь нужно разместить анонс этого тренинга у себя в журнале или на своем сайте. В тексте анонса не забудте поставить линк на этот пост! Если вы не успели попасть в список первых 20 счастливчиков и заплатили за курс - можете этого и не делать. Хотя пиар всячески приветствуется — чем больше нас будет, тем будет интереснее и тем больше будет интересных вопросов!

Далее, до 21:00 по московскому времени 19 марта 2008 вам нужно отписаться в комментариях К ЭТОЙ ЗАПИСИ (а не в ЖЖ или еще где-то), с указанием линка на ваш пост и вашего e-mail адреса. После того, как вы отпишитесь здесь, вам нужно зайти на форум и зарегистрироваться.

Также рекомендую подписаться на RSS Feed этого блога, чтоб следить за обновлениями и новостями. Ну или воспользоваться услугами сервиса rss2email , чтоб получать обновления к себе на почту.

БОНУСЫ!

Первые 5 участников, которые успешно закончат этот тренинг — получат БОНУСЫ:

  • бесплатную путевку на Гаваи,
  • доступ к обучающему аудиокурсу — по установке FreeBSD и настройки сети и безопасности. Суммарная стоимость этого курса — 39EUR + 49EUR+ 79EUR = 167EUR.

Вы можете получить это совершенно БЕСПЛАТНО! Записываетесь на курс, приходите к финишу первым и получаете причитающиеся вам бонусы.

ОПЛАТА!

  • при помощи Webmoney — переведите на рублевый кошелек R374057138343 с пометкой “программирование на shell” и ОБЯЗАТЕЛЬНО пишете в назначении платежа СВОЙ e-mail.
  • Yandex.Деньги — переведите на кошелек 4100xxxxxxxx необходимую сумму с пометкой “программирование на shell”   и ОБЯЗАТЕЛЬНО пишете в назначении платежа СВОЙ e-mail.



Новогодняя распродажа 80% + ноутбук в подарок!!! 26 декабря, СПЕШИТЕ!!!