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

Понравилось? Подпишись на RSS!

Хочешь написать статью? Мы ищем авторов (и не только за красивые глаза, но и за дохлых президентов).

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


  1. 1 Trojan

    1. Насчет find, можно и так
    find ./ ‘abc*’ -exec rm -rf {} \;

    2. в условии порекомендовал бы брать в двойные ковычки …
    if [[ -z "${VAR1}" ]] ….

    3. ping -c foo.bar > /dev/null 2>/dev/null
    а в место этого можно прост ping -c 3 foo.bar &>/dev/null

Leave a Reply