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

