7 способов улучшить ваши shell скрипты на /bin/sh
Материал из RSU WiKi
Несколько приемов для того, чтоб сделать свои скрипты компактнее, быстрее и правильней:
Содержание |
Упрощение конструкции с if
Конструкцию
if команда1
then
команда2
fi
можно заменить просто на
команда1 && команда2
Упрощение конструкции с if !
Конструкцию
if ! команда1
then
команда2
fi
можно заменить просто на
команда1 || команда2
Если вы используете шаблоны или подстановку аргументов в shell
Если вы используете шаблоны (скажем, *) или подстановку аргументов в shell при помощи ``, то если их много shell не может сделать такую подстановку. Тогда стоит прибегнуть к помощи команды xargs.
Т.е. строчка
rm *
в директории, которая содержит слишком много файлов, может превратиться в
ls | xargs rm
Или же
rm `find ./ -name pkg-descr`
может превратиться в
find ./ -name pkg-descr | xargs rm
Ускорить grep
Если вы ищите какую-то строку в больший объемах данных при помощи grep, то стоит использовать fgrep — который позволяет искать только вхождения строк, а не регулярных выражений — но и работает быстрее на 10-20%.
Пишем условия правильно
Для того, чтоб при проверке условий не появлялось бы ошибок при неправильном пользовательском вводе, скажем если INPUT пустая строка
if [ $INPUT = test ]; then ... fi
то стоит применять либо вариант с дописыванием одного символа с обоих сторон сравнения
if [ x$INPUT = xtest ]; then ... fi
либо брать переменную в двойные кавычки
if [ "$INPUT" = test ]; then ... fi
Чтоб не дать команде выводить что-либо на экран
Можно использовать перенаправление стандартного вывода и стандартного потока ошибок в /dev/null
ping -c foo.bar > /dev/null 2>/dev/null
После этого уже можно проверять код завершения этой программы.
Осторожно фильтруем список выполняемых команд
Если вы из скрипта хотите отослать сигнал завершения или какой-либо другой группе команд и используете для этого строчку типа
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 из списка убиваемых процессов.

