На сегодняшний день существует большое количество различных языков
программирования, начиная от простых, Perl и заканчивая не простыми 🙂
Kylix и C. Каждый язык имеет свои достоинства и недостатки. Возьмем, например, командный интерпретатор в UNIX Bourn Shell (он полностью совместим с интерпретатором BASH в Linux), основным его преимуществом является то, что он интегрирован непосредственно в консоль (шелл) *nix систем, то
есть умея работать с консолью и имея знания шелл кодинга вы можете писать сценарии (скрипты).
Важным недостатком (по моему) является то, что в шелл кодинге вы не сможете так издеваться над кодом программы как например в Перле. Я постараюсь описать основные аспекты шелл программирования, в Linux-e (в UNIX-e он имеет некоторые отличия, но не очень большие), то есть я рассчитываю на то, что читатель данного материала имеет уже какие-то знания в этой области.
1. Начнем с азов :), а именно с переменных. При обработки переменных, хранящих строки, их желательно заключать в кавычки. Например:
if [ "$USER" == "root" ]; then
действия
fi
Если вы считаете, что не имеет значения какие кавычки использовать, то вы ошибаетесь. Текст в двойных кавычках "" проверяется на содержание различного рода метасимволов (\n,\c,\t и т.д.), а текст заключенный в одинарных кавычках обрабатывается как есть,
то есть без учета выше приведенных символов. Например:
echo -e "ehhhh\nehhhh" - выведет 2 строки содержащие слово "ehhhh".
echo -e 'ehhhh\nehhhh' - выведет как есть, ehhhh\nehhhh, без учета перехода на новую строку.
2. При составлении больших сценариев, нужно позаботиться о их отладки, чтобы быстро найти и ликвидировать ошибку в коде, если такая имеется. Данной операцией занимается команда "set опции_вызова". Она имеет следующие опции:
-v -- отображение всех строк сценария при его выполнении
-x -- отображение всех команд и их аргументов, при выполнении сценария
Вам нужно в начале сценария поместить команду set и установить для нее опции, а в конце снять их. Снимаются опции так "set +опция_без_-" - конечно чуть не удобно. Если сценарий выполнился без каких либо ошибок - данные строки (с set командой) можно удалить.
3. Если ваш сценарий будет производить запись в какие-либо файлы вы должны обязательно проверять права доступа на них (так например на вашей машине они могут быть открыты, а на другой закрыты, что приведет к ошибке и некорректного выполнения сценария). Для этого используйте конструкцию:
if [ -w имя_файла ]; then
производится запись
else
ошибка …
fi
4. Каждый сценарий должен, иметь понятные сообщения об ошибках! А именно, каждое сообщение должно содержать следующее:
имя сценария в котором произошла ошибка : описание самой ошибки
Можно этого не делать 🙂 BASH сам будет выводить сообщения об ошибках, но они не всегда понятны пользователю, поэтому лучше сообщения об ошибках, которые посылает BASH,
перенаправлять (2>) в системную корзину (/dev/null) и делать для них свои описания. Для указания имя сценария в котором произошла ошибка, можно использовать конструкцию "basename $0" или просто значение переменной "$0". Если вы создаете большой сценарий не забывайте делать файл - журнал ошибок, который будет содержать описание ошибок и дату их появления.
5. После выполнения в сценариях каких либо очень важных команд, не забывайте просматривать содержимое переменной "$?". Если она содержит 0, то команда выполнилась без ошибок, если 1 - то были ошибки.
6. В BASH-e есть такая команда, которая возвращает всегда значение true, данная команда носит название null (:), то есть если вы хотите чтобы при каком-то определенном условии не чего не выполнялось, воспользуйтесь ею.
Пример:
if [ -t ]; then
echo "Сценарий выполняется в приоритетном режиме"
else
:
fi
7. Все наверно знают и уже пользовались оператором "while", но не многие знают, что с помощью него можно считывать поочередно строки из файла для последующей их обработки:
while read line; do
Echo $line
done < имя_файла
8. Иногда, нужно вывести большое количество определенного текста на экран, в данном случае будет нерационально писать все время команду echo и передавать ей строки для вывода на экран. Поэтому можно воспользоваться следующим методом (данный метод носит название "Документ здесь"):
cat << слово
сам текст который должен отображаться на экране
слово
Данный метод очень удобен и тогда, когда какой-то команде нужно поочередно передать большое количество опций или аргументов.
9. Вот мы и дошли до функций :).Все функции должны описываться в самом начале сценария, но это желательно только для так называемых локальных функций. Если вы пишите группу сценариев, которые имеют одинаковые функции, то лучше сделать для них исполняемый файл, он будет содержать глобальные функции (чтобы не повторять их в каждом сценарии), вам останется только подключить его во всех сценариях :
.путь_к_файлу_функций
Не пишите сразу все функции, пишите их по очереди и проверяйте, в данном случае вы избавите себя от поиска ошибок во всех функциях. Название переменных объявленных и использующихся в теле функций, должны начинаться с прочерка "_". Так же при составлении функции не забывайте делать возврат ее значения:
return 0 - при выполнении функции ошибок не наблюдалось
return 1 - Присутствовали ошибки
10. Ну и последнее, если в вашем сценарии нужно прочитать, нажатие какой-то одной клавиши, при этом не выводить ее на экран, вы можете использовать эту функцию:
function read_key()
{
_SAVESTTY=`stty -g` # сохраняем настройки терминала
stty -echo # запрещаем вывод каких либо символов на экран
stty cbreak
_key=`dd if=/dev/tty bs=1 count=1 2> /dev/null` # считываем нажатие 1-ой клавиши, ошибки отправляем в системную корзину
stty -cbreak
echo $_key
stty $_SAVESTTY # восстанавливаем настройки терминала
}
Пока вроде все, но есть и другие сказки про пяточка и кролика …:). Удачи!