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

Ссылки