Как вы уже наверняка знаете, Linux состоит из нескольких основных частей, таких как ядро, командная оболочка (Shell) и графический интерфейс (Gnome, KDE и т. д.).
Shell переводит ваши команды и отправляет их в систему. Большинство дистрибутивов Linux поставляются с большим разнообразием оболочек.
Каждая оболочка имеет свои особенности, и некоторые из них сегодня очень популярны среди разработчиков. Вот некоторые из самых популярных типов оболочек:
- Sh shell: также называемая оболочкой Борна, разработанная в AT&T labs в 70-х годах парнем по имени Стивен Борн. Эта оболочка отличается богатым функционалом;
- Bash shell: также называемая Bourne again shell. Очень популярна и совместима со сценариями sh-оболочки, поэтому вы можете запускать свои sh-сценарии без каких-либо изменений;
- Ksh shell: также называется оболочкой Korn, она совместима с sh и bash. Ksh предлагает некоторые улучшения по сравнению с оболочкой Bourne;
- Csh и tcsh: Linux был построен с использованием языка C, и это побудило разработчиков из Университета Беркли разработать оболочку в стиле C, в которой синтаксис подобен языку C. Tcsh добавляет некоторые незначительные улучшения в csh.
Каждый вариант оболочки имеет свой собственный набор распознаваемых команд и функций. Все оболочки расположены либо в каталоге /usr/bin/, либо в каталоге /bin/, в зависимости от разновидности UNIX и конкретной версии системы.
Скрипты Shell
Основная концепция скриптов Shell – это список команд, которые перечислены в порядке их выполнения. Хороший сценарий оболочки будет иметь комментарии, перед которыми стоит знак фунта или знак хеша (#), описывающий шаги. Существуют условные тесты, такие как значение A больше значения B, циклы, позволяющие нам просматривать огромные объемы данных, файлы для чтения и хранения данных, переменные для чтения и хранения данных. Также скрипт может содержать функции.
Каждый хороший разработчик должен всегда начинать с определения четкой цели. С ясной целью у нас есть конкретные задачи для скрипта и набор соответствующих ожидаемых результатов. Мы также дадим несколько советов, трюков и, конечно же, уловок при решении задачи одним способом, а не другим, чтобы получить тот же результат. Все техники не должны быть однозначными.
Сценарии и функции оболочки интерпретируются. Это означает, что они не компилируются. И сценарии, и функции оболочки представляют собой текст ASCII, который читается интерпретатором команд Shell. Когда мы выполняем сценарий оболочки или функцию, интерпретатор команд просматривает текст ASCII строка за строкой, цикл за циклом, тест за тестом и выполняет каждый оператор при достижении каждой строки сверху вниз.
Функции
Функция пишется почти так же, как скрипты Shell, но отличается тем, что она определяется или пишется внутри сценария оболочки большую часть времени и вызывается внутри сценария. Таким образом, мы можем написать кусок кода, который используется снова и снова, всего один раз, и использовать его без необходимости каждый раз переписывать код. Вместо этого мы просто вызываем необходимую функцию.
или
Когда мы пишем функции для скриптов, важно помнить, что объявить или написать функцию нужно прежде, чем мы ее используем. Функция должна появиться над оператором команды, вызывающей функцию. Мы не можем использовать то, чего еще не существует.
Запуск скриптов Shell
Shell-скрипт может быть выполнен следующими способами:
создаст оболочку Korn и выполнит shell_script_name во вновь созданной среде оболочки Korn. То же самое верно для оболочек sh и bash.
выполнит shell_script_name, если в файле установлен бит выполнения. Сценарий будет выполняться в оболочке, объявленной в первой строке сценария оболочки. Если оболочка не объявлена в первой строке сценария оболочки, она будет выполняться в оболочке по умолчанию, которая является определяемой системой оболочкой пользователя. Выполнение в непредусмотренной оболочке может привести к сбою и дать непредсказуемые результаты.
Объявление оболочки в скрипте Shell
Если мы хотим иметь полный контроль над тем, как будет выполняться скрипт оболочки и в какой оболочке он должен выполняться, мы должны объявить оболочку в первой строке скрипта. Если оболочка не объявлена, скрипт будет выполняться в оболочке по умолчанию, определенной системой для пользователя, выполняющего скрипт оболочки. Если сценарий был написан, например, для выполнения в оболочке Bash, и оболочкой по умолчанию для пользователя, выполняющего сценарий оболочки, является оболочка C (csh), то во время выполнения скрипта скорее всего произойдет ошибка.
Комментарии и стили в скриптах Shell
Создание хороших комментариев в наших скриптах играет очень важную роль в разработке. То, что для нас очевидно, может быть совершенно непонятно для тех, кто идет по нашим стопам. Мы должны написать код, который будет читабелен и прост для понимания. Это включает в себя написание скрипта, который легко читать и поддерживать, что означает, что в нем должно быть много комментариев, описывающих разные шаги. По большей части, тот, кто пишет скрипт оболочки, не является человеком, который должен его поддерживать. Нет ничего хуже, чем взламывать чужой код, у которого нет комментариев, чтобы узнать, что должен делать каждый шаг. Вначале может быть достаточно сложно изменить сценарий, но необходимость выяснить мышление автора сценария иногда заставляет нас задуматься о переписывании всего скрипта Shell с нуля. Мы можем избежать этого, написав хорошо читаемый скрипт и вставив множество комментариев, описывающих нашу философию и то, как мы используем ввод, вывод, переменные и файлы.
Для хорошего стиля в наших командах, нам нужно, чтобы он был читабельным. По этой причине иногда лучше, например, разделить оператор команды на три отдельные строки вместо того, чтобы связывать или объединять все вместе в одной строке кода. Для нового разработчика иной раз может быть слишком трудно следовать по проторенной дорожке и при этом понимать, каким должен быть ожидаемый результат. Однако в некоторых случаях более желательно создать именно длинную дорогу. Но, опять же, она должна содержать комментарии, описывающие наше мышление шаг за шагом. Таким образом, кто-то позже посмотрит на наш код и скажет: «Эй, а это отличный способ реализации скриптов».
Удобочитаемость команд и пошаговые комментарии – это только основы хорошо написанного сценария. Использование большого количества комментариев значительно облегчит нашу жизнь, когда мы вернемся к коду, не глядя на него в течение шести месяцев. Комментируйте все! Сюда входит и описание того (но не ограничивается этим), для чего используются наши переменные и файлы, описанием того, что делают циклы, описанием каждого теста, включая ожидаемые результаты и как мы манипулируем данными и множеством полей данных. Хеш-знак # предшествует каждой строке комментария.
Использование break, continue, exit и return
Иногда необходимо выйти из цикла for или while, продолжить работу в следующем блоке кода, полностью выйти из сценария или вернуть результат функции обратно в сценарий, вызвавший функцию.
- Команда break используется для прекращения выполнения всего цикла после завершения выполнения всех строк кода вплоть до оператора break. Затем она спускается до кода, следующего за концом цикла;
- Команда continue используется для передачи управления следующему набору кода, но она продолжает выполнение цикла;
- Команда exit будет делать то, что и следовало ожидать: она завершает весь сценарий. Целое число может быть добавлено к команде exit (например, exit 0), которая будет отправлена как код возврата;
- Команда return используется в функции для отправки данных обратно или возврата результата или кода возврата вызывающему скрипту.
Переменные
Переменная – это строка символов, которой мы присваиваем значение. Назначенное значение может быть числом, текстом, именем файла, устройством или данными любого другого типа. Переменная является не чем иным, как указателем на фактические данные. Мы будем использовать переменные в наших сценариях так часто, что для нас будет необычным их не использовать. Использование имен переменных в верхнем регистре не рекомендуется в реальном мире программирования оболочки, так как эти переменные в верхнем регистре могут наступать на системные переменные среды, которые также находятся в верхнем регистре. Когда вы пишете свои собственные скрипты Shell, делайте переменные строчными буквами. Чтобы назначить переменную для указания на данные, мы используем UPPERCASE= “value_to_assign” в качестве синтаксиса присваивания. Чтобы получить доступ к данным, на которые указывает переменная UPPERCASE, мы должны добавить в качестве префикса знак доллара $, например, $UPPERCASE. Для просмотра данных, назначенных переменной, мы используем echo $UPPERCASE, print $UPPERCASE для переменных или cat $UPPERCASE, если переменная указывает на файл, в качестве структуры команды.
Корректное использование команды echo
Мы используем команду echo для отображения текста. Команда echo позволяет использовать множество элементов управления курсором с использованием операторов обратной косой черты: n для новой строки, c для продолжения на той же строке, b для возврата курсора, t для табуляции, r для возврата каретки и v для вертикального перемещения на одну строку. В оболочке Korn команда echo по умолчанию распознает эти параметры команды. В оболочке Bash мы должны добавить ключ -e к команде echo, echo -e “n”для одной новой строки.
Мы можем запросить систему на наличие исполняемой оболочки, запросив переменную оболочки $SHELL в скрипте. Многие дистрибутивы Linux будут выполняться в оболочке Bash, даже если мы указываем оболочку Korn в самой первой строке скрипта. Поскольку оболочка Bash требует использования переключателя echo -e для включения операторов обратной косой черты, мы можем использовать оператор case для псевдонима команды echo для вывода echo -e, если исполняемая оболочка */bin/bash. Теперь, когда нам нужно использовать команду echo, мы уверены, что она будет правильно отображать текст.
Добавьте следующий сегмент кода ко всем своим сценариям оболочки Korn в разделе объявления переменных, и эта небольшая проблема будет решена: