Как сделать скрипт в linux

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

Сценарий (скрипт) оболочки Bash представляет собой текстовый файл с набором команд, которые необходимо выполнить в определенном порядке и/или условиями. Bash-скрипт призван избавить пользователей Linux от ввода множества различных команд для решения частых задач.

Где хранить Bash-сценарии?

Перед началом написания сценария нужно определиться с местом его хранения. Системные сценарии обычно находятся в директориях /bin и /sbin , а также в /usr/bin и /usr/sbin . Для собственных сценариев рекомендую использовать каталоги /usr/local/sbin и /usr/local/bin , однако ничто вам не мешает (кроме ограничения прав записи) хранить свои сценарии в любых других не системных каталогах.

Если вы решили использовать, какой-либо нестандартный каталог, то не забудьте добавить его в переменную среды $PATH , чтобы вы могли запускать свои сценарии по имени, без указания полного пути.

Изменять переменную $PATH следует в файле ~/.bash_profile , если его нет то в ~/.profile .

Например, если я хочу хранить сценарии в каталоге ~/oleg/bash_scripts , то мне необходимо написать следующую строку.

Так при инициализации работы оболочки ваш каталог уже будет добавлен в переменную $PATH .

.jpg

SliTaz предоставляет некоторые средства разработки для веб-дизайна, редактирования скриптов и исходного кода. В этой статье содержится общая информация для разработчиков и желающих к ним приобщиться.

Скрипты командной строки

Написание скриптов командной строки (shell-скриптов) — самый простой способ начать программировать, т.к. они дают быстрые результаты и всё, что вам нужно уметь, перед тем как садиться писать такой скрипт — это открыть терминал и использовать текстовый редактор: Nano, Leafpad или Geany. Shell-скрипты в Linux способны на многое — загружать систему, делать резервные копии, осуществлять рутинные операции, выводить информацию о системе, создавать и изменять файлы и т.д. В таких скриптах можно использовать переменные, функции или вызовы для запуска того или иного файла. Скрипту можно давать любое удобное для вас имя, при этом широко используется расширение .sh.

Создание shell-скриптов

Перед тем как создавать shell-скрипт, необходимо выяснить, какой интерпретатор используется в системе. Большинство скриптов используют /bin/sh, поскольку он более портативен, но существуют также скрипты, опирающиеся на /bin/bash, поэтому он тоже должен быть установлен в системе. Чтобы скрипт можно было запустить, его нужно сделать исполняемым, изменив его права доступа в командной строке утилитой chmod. Чтобы создать скрипт script.sh и сделать его исполняемым, используйте команды

Получив исполняемый файл, можно приступать к его редактированию. Вы можете оставаться в терминале и использовать редактор Nano (для сохранения и выхода нажмите Ctrl+X) или Leafpad:

Ниже приведен скрипт, содержащий переменную NAME и выводящий ее значение командой echo:

После создания или редактирования скрипта его можно запустить для проверки:

Это было краткое введение в shell-скрипты. В Интернете очень много информации по этой теме, если она вас заинтересует.

Dialog

Приложение dialog может создавать консольные программы с графическим интерфейсом, как, например, инсталлятор SliTaz. Файлы настроек программы находятся в папках /etc/dialogrc и/или ~/dialogrc для каждого пользователя. Вот простой пример использования dialog через командную строку:

Geany IDE

Geany относится к интерактивным средам разработки (Interactive Development Environment, IDE). Geany — простая и быстрая программа, она имеет подсветку синтаксиса, вкладки и функцию автозавершения. Geany использовался при создании большей части документации на этом сайте (и еще немного Nano).

Для установки Geany выполните команду

При первом запуске программы вы можете изменить ее настройки в меню ПравкаНастройки. Также Geany можно запустить из терминала командой

Интересно, что при компиляции исходного кода в скрипте ./configure будет указана опция -enable-the-force… (задействовать Силу). Она понадобится вам, если вы захотите почувствовать себя Люком Скайуокером!

Perl (Microperl) — создание и использование Perl-скриптов

В SliTaz вы можете использовать мощный скриптовый язык Perl, запустив его как perl или microperl. Microperl — это модернизированная версия Perl, собранная из официальных исходников. Perl-скрипты, использующие Microperl, совместимы с полной версией Perl. Одна из сильных сторон Perl — его портативность: его можно использовать на любой системе и он является интерпретируемым языком, что означает отсутствие необходимости в компилировании кода и возможность его запуска напрямую. В SliTaz Perl и Microperl по умолчанию не входят в состав Live CD, поэтому вам понадобится либо перепаковать Live CD, либо установить Perl через менеджер пакетов. К сведению: Microperl имеет размер всего 1 Мб и не предоставляет модулей. Установку Perl (или Microperl) можно произвести командой

Первая строка скрипта определяет путь к интерпретатору Perl, обычно это /usr/bin/perl. Для вывода на экран текста используется команда print. Нужно отметить, что Perl чувствителен к регистру и что каждая строка кода должна заканчиваться точкой с запятой. Вот сам код (вы можете его скопировать и вставить в редактор):

Чтобы выполнить скрипт, в командной строке наберите

CGI-скрипты и Perl

Когда сервер настроен должным образом, можно поместить скрипты в папку $HOME/Public/cgi-bin, задав им расширение .pl или .cgi, и просматривать их на локальном или удаленном компьютере. Пример использования скрипта Perl CGI:

Python

Официальный репозиторий SliTaz под названием Mercurial базируется на веб-интерфейсе CGI/Python; такое сочетание подходит для создания надежного и мощного продукта.

Для установки Python выполните команду

Чтобы установить Ruby, наберите

Toolchain — библиотеки, компилятор С и различные утилиты

Чтобы компилировать программное обеспечение из сторонних или ваших собственных исходников, вам понадобится по крайней мере минимальный набор утилит, куда войдут Binutils, Glibc, компилятор С, заголовочные файлы ядра Linux и утилита Make. Toolchain также используется разработчиками SliTaz для сборки системы из исходников. Для установки toolchain со всеми зависимостями введите

Текущая версия toolchain может без проблем компилировать простые программы в режиме командной строки, используя Ash из состава Busybox, но некоторые программы посложнее потребуют наличия Bash для компиляции. GNU Bash доступен в качестве пакета вместе с другими средствами разработки, например, Flex, M4, Bison или Pkg-config. Если вам нужно найти pkg-config, то используйте команду

Если вы хотите компилировать программы, использующие библиотеку Ncurses, потребуется установить пакет ncurses-dev. Этот пакет также имеет в своем составе несколько маленьких программ, к примеру, tic и tac.

Что нужно, чтобы писать скрипты
Владение инструментами командной строки и их необходимыми опциями.
Базовые знания английского языка уровня начальной школы не помешают.

Зачем нужны скрипты
Во-первых, администрирование linux-сервера в той или иной степени сводится к систематическому выполнению одних и тех же команд. Причем не обязательно, чтобы эти команды выполнял человек. Их можно запрограммировать на выполнение машиной.
Во-вторых, даже просто выполнение обычной задачи, которая (вдруг) составляет 20-1000. однообразных операций ГОРАЗДО проще реализовать в скрипте.

Что такое скрипт
Скрипт - набор инструкций, которые должен в определенном порядке и в определенное время выполнить компьютер. Инструкциями могут быть как внутренние команды оболочки (циклы, условия, обработка текстовой информации, работа с переменными окружения и прочее), так и любая программа, выполняемая нами в консоли с необходимыми параметрами.

Напутствие
Я Вам искренне советую писать как можно больше комментариев чуть ли ни к каждой строчке в скрипте. Пройдет время и Вам понадобится изменить или модернизировать написанный когда-то скрипт. Если не помнишь или не понимаешь, что написано в скрипте, то становится сложно его изменять, проще писать с нуля.

Какие скрипты могут нам понадобиться:
устанавливающий правила файервола при загрузке системы.
выполняющий backup настроек и данных.
добавляющий почтовые ящики в почтовый сервер (точнее в базу mysql)
запускающий в определенное время (лучше каждую ночь) программу, которая сканирует логи прокси-сервера и выдает удобный web-отчет по количеству скачанного трафика.
отправляющий нам на почту информацию о том, что кто-то получил доступ к нашему серверу по ssh, время подключения и адрес клиента.

О методике написания скриптов
Создаем текстовый файл, редактируем его, устанавливаем права на выполнение, запускаем, смотрим ошибки, исправляем, запускаем, смотрим ошибки.
Когда все вылизано и работает правильно, ставим его в автозагрузку либо в планировщик на определенное время.

2. Обучение написанию сценариев на внутреннем языке BASH

Это руководство предполагает отсутствие предварительных знаний о методике написания сценариев (далее скриптов) с помощью внутреннего языка Bash. С помощью данного руководства вы обнаружите в скором времени, что написание скриптов очень простая задача. Давайте начнем наше обучение с простого сценария, выполняющего вывод строки "Hello World!" (в перев. с англ. - Всем привет!)

Выпускаем серию статей о том, как писать скрипты Bash. Подойдет начинающим!

скрипты bash

Что такое Bash/Shell/Scripting

Bash - это интерпретатор командного языка. Он широко доступен в различных операционных системах и является командным интерпретатором по умолчанию в большинстве систем GNU/Linux. Название является акронимом для 'Bourne-Again SHell'.

Shell - это макропроцессор, который позволяет выполнять команды в интерактивном или неинтерактивном режиме.

Скриптинг позволяет автоматически выполнять команды, которые в противном случае выполнялись бы интерактивно одна за другой.

Основы сценариев оболочки Bash

Не отчаивайтесь, если вы не поняли ни одного из приведенных выше определений. Это совершенно нормально, ведь именно поэтому вы читаете эту статью.

Если вы не знали, Bash Scripting является обязательным навыком для любой работы в Linux системного администрирования, даже если работодатель может не требовать этого в явном виде.

Что такое Shell

Скорее всего, в данный момент вы сидите за компьютером, открыли окно терминала и задаетесь вопросом: "Что же мне делать с этой штукой?".

Так вот, в окне терминала перед вами находится shell, а shell позволяет вам с помощью команд взаимодействовать с компьютером, следовательно, получать или хранить данные, обрабатывать информацию и выполнять различные другие простые или даже очень сложные задачи.

Попробуйте это прямо сейчас! Используйте клавиатуру и введите несколько команд, таких как date, cal, pwd или ls, после чего нажмите клавишу ENTER.

Вы только что сделали то, что с помощью команд и командной оболочки взаимодействовали с компьютером, чтобы получить текущую дату и время (date), просмотреть календарь (cal), проверить расположение текущего рабочего каталога (pwd) и получить список всех файлов и каталогов, расположенных в нем (ls).

*у нас в папке пока ничего нет, поэтому команда ls не дала вывода.

Что такое скриптинг (сценарии Bash)

Теперь представьте, что выполнение всех вышеперечисленных команд является вашей ежедневной задачей. Каждый день вы должны безошибочно выполнять все вышеперечисленные команды, а также сохранять наблюдаемую информацию. Вскоре это станет чрезвычайно утомительной задачей, обреченной на провал. Поэтому очевидная идея - придумать способ выполнения всех команд вместе. Именно здесь скриптинг становится вашим спасением.

Чтобы понять, что подразумевается под сценариями, используйте shell в сочетании с вашим любимым текстовым редактором, например vi, чтобы создать новый файл task.sh, содержащий все вышеперечисленные команды, каждую в отдельной строке. После этого сделайте новый файл исполняемым с помощью команды chmod с опцией +x. И наконец, запустите новый скрипт, добавив к его имени ./.

Как видите, с помощью сценариев можно автоматизировать любое взаимодействие с оболочкой. Более того, теперь можно автоматически выполнять наш новый сценарий task.sh ежедневно в любое заданное время с помощью планировщика заданий cron и сохранять вывод сценария в файл при каждом его выполнении. Однако это уже другая история, а пока давайте сосредоточимся на предстоящей задаче.

Что такое Bash

До сих пор мы рассматривали shell и сценарии. А что насчет Bash? Где находится bash? Как уже упоминалось, bash является интерпретатором по умолчанию во многих системах GNU/Linux, поэтому мы использовали его, даже не осознавая этого. Вот почему наш предыдущий сценарий оболочки работает даже без определения bash в качестве интерпретатора. Чтобы узнать, какой у вас интерпретатор по умолчанию, выполните команду echo $SHELL:

Существуют различные другие интерпретаторы оболочки, такие как Korn shell, C shell и другие. Поэтому хорошей практикой является явное определение интерпретатора оболочки, который будет использоваться для интерпретации содержимого скрипта.

Имена файлов и разрешения

Далее давайте кратко обсудим права доступа к файлам и имена файлов. Вы, наверное, уже заметили, что для выполнения сценария shell файл должен быть сделан исполняемым с помощью команды chmod +x FILENAME. По умолчанию все вновь созданные файлы не являются исполняемыми, независимо от суффикса расширения файла.

На самом деле, расширение файла в системах GNU/Linux не имеет никакого значения, кроме того, что при выполнении команды ls для перечисления всех файлов и каталогов сразу становится ясно, что файл с расширением .sh - это, скорее всего, сценарий оболочки, а файл с .jpg - сжатое с потерями изображение.

В системах GNU/Linux команда file может быть использована для определения типа файла. Как видно из приведенного ниже примера, расширение файла не имеет никакого значения, а интерпретатор оболочки, в данном случае, имеет больший вес.

Таким образом, имя shell-сценария 0_xyz вполне допустимо, но по возможности его следует избегать.

Выполнение скриптов Bash

Далее поговорим об альтернативном способе выполнения сценариев bash. В упрощенном виде сценарий bash - это не что иное, как текстовый файл, содержащий инструкции, которые должны быть выполнены в порядке сверху вниз. То, как интерпретируются инструкции, зависит от определенного shebang или способа выполнения скрипта. Рассмотрим следующий видеопример:

Другим способом выполнения сценариев bash является явный вызов интерпретатора bash, например, $ bash date.sh , что позволяет выполнить сценарий без необходимости делать сценарий оболочки исполняемым и без объявления shebang непосредственно в сценарии оболочки. При явном вызове исполняемого двоичного файла bash содержимое нашего файла date.sh загружается и интерпретируется как сценарий оболочки Bash.

Относительный и абсолютный путь

Наконец, прежде чем мы запрограммируем наш первый официальный сценарий оболочки bash, давайте кратко обсудим навигацию оболочки и разницу между относительным и абсолютным путем к файлу.

Наверное, лучшая аналогия для объяснения относительного и абсолютного пути к файлу - это представить файловую систему GNU/Linux как многоэтажное здание. Корневой каталог (входная дверь здания), обозначенный /, обеспечивает вход во всю файловую систему (здание), а значит, дает доступ ко всем каталогам (уровням/комнатам) и файлам (людям).

Чтобы перейти в комнату 1 на уровне 3, нам сначала нужно войти в главную дверь /, затем пройти на уровень 3 level3/ и оттуда войти в комнату 1. Следовательно, абсолютный путь к этой конкретной комнате в здании - /level3/room1. Отсюда, если мы хотим посетить комнату2 на уровне 3, нам сначала нужно покинуть наше текущее местоположение - комнату1, введя ../, а затем включить название комнаты room2. Мы взяли относительный путь к room2, который в данном случае будет ../room2. Мы уже находились на уровне 3, поэтому не было необходимости покидать все здание и идти по абсолютному пути через главный вход /level3/room2.

К счастью, в GNU/Linux есть простой инструмент компас, который поможет вам ориентироваться в файловой системе в виде команды pwd. Эта команда при выполнении всегда выводит ваше текущее местоположение. В следующем примере используются команды cd и pwd для навигации по файловой системе GNU/Linux с использованием абсолютных и относительных путей.

Быстрый совет:

Выполните команду cd без аргументов, чтобы мгновенно перейти в домашний каталог пользователя из любого места. Выполните команду cd - для переключения между двумя последними посещенными местами. В каком каталоге вы оказались после выполнения команд cd ~ и cd .

Навигация по файловой системе GNU/Linux - это простая, но для многих очень запутанная тема. Ознакомьтесь с навигацией по файловой системе GNU/Linux, прежде чем переходить к следующим разделам этого учебника.

Типичный способ запуска таких приложений выглядит следующим образом:

Приложение, реализованное на языке Python, обычно знает какой интерпретатор ему нужен, а вот его пользователь может не знать

В UNIX-мире есть механизм, позволяющий указать интерпретатор для запуска файла

  • Текстовому файлу должны быть выданы права на выполнение
  • В начале текстового файла может быть указана информация, по которой загрузчик программ, автоматически выберет интерпретатор

Shebang

Строка для выбора интерпретатора называется Shebang:

В случае, если в начале файла указана данная строка, то при его запуске загрузчик постарается найти интерпретатор и запустит интерпретатор с указанным файлом

Путь к интерпретатору должен быть абсолютным, т.к. данный механизм по умолчанию не использует подсистему поиска по PATH. Если необходима функциональность по поиску интерпретатора, тогда следует использовать /usr/bin/env

Рассмотрим простейшее приложение на языке Bash:

Запишем его в файл /home/user/script.sh и дадим права на исполнение

Для запуска скрипта необходимо:

  • либо указать полный путь к исполнямому файлу в качестве команды
  • либо поместить файл в один из каталогов PATH

Исполняемые скрипты для выполнения административных задач в Linux можно писать на множестве языков: Python, Ruby, Perl, Bash и так далее

При выборе языка программирования необходимо учитывать множество факторов:

  • Сколько времени нужно будет поддерживать скрипт?
  • Кто будет поддерживать скрипт?
  • Насколько сложную задачу необходимо решать?
  • Сложность задачи состоит в последовательности вызова программ или в обработке данных?
  • Скрипт должен поддерживать работу на одной или нескольких платформах?

Если задача требует сложных вычислений и её необходимо поддерживать достаточно долго, то рекомендуется использовать более продвинутые языки программирования

Использование Ruby

  • Для настройки систем есть специализированные проекты Chef и Puppet
  • Для выполнения действий над файлами можно использовать библиотеку FileUtils
  • Для запуска внешних процессов есть мощная библиотека open3
  • Для выполнения действий по сети есть библиотеки net-ssh и net-scp

Использование Python

  • Для настройки систем есть специализированные проекты Ansible и Salt
  • Для выполнения действий над файлами можно использовать библиотеку shutil
  • Для запуска внешних процессов есть библиотека Subprocess
  • Для выполнения действий по SSH есть библиотека paramiko

С базовым синтаксисом Bash мы уже знакомы

Bash выполняет каждую строку как отдельную команду, которую вводили в терминале

Документация

Наиболее полная книжка по Bash называется Advanced Bash Scripting Guide

  • Расширение путей: * , ? , [[:upper:]]
  • Расширение скобок:
  • Арифметическое расширение: $((5 + 10))
  • Расширение переменных: $
  • Замена команд: $(ls)

Все эти элементы можно и нужно использовать при написании скриптов

Для объявления переменной используется синтаксис:

Для получения доступа к значению переменной используйте $name

  • Пробелы вокруг знака равенства недопустимы
  • Если не указать значение, то переменная будет содержать нулевую строку
  • Декларирование переменных может происходить в рамках команд alias , declare , typeset , export , readonly , local
  • Для отмены значений переменной необходимо использовать unset name
  • В названии переменной можно использовать латинские символы, подчёркивания
  • В качестве значения может выступать любое строковое выражение, к которому будут применены все расширения

Для обхода набора значений удобно воспользоваться циклами

Циклы можно использовать для обработки вывода из приложения

Благодаря наличию данного оператора можно говорить, что Bash является языком программирования. Важно понимать, что этот язык — узкоспециализированный, ориентированный на обработку строк и запуск внешних задач, поэтому разрабатывать на нём сложные приложения не стоит

Если последняя команда из списка в условии вернёт 0, тогда будут выполнены команды в then -списке, в противном случае будет протестированы команды из elif

Стандартное определение функции main на языке Си:

  • int argc — количество аргументов
  • char* argv[] — массив с аргументами
  • char** envp — массив с переменными окружения в формате КЛЮЧ=ЗНАЧЕНИЕ
  • int main , метод возвращает целое значение, обозначающее результат выполнения
    • 0 — программа выполнила все действия корректно
    • !=0 — во время работы программы возникли ошибки, некорректное завершение

    В BASH переменная ? позволяет узнать статус выполнения последней команды

    Приложение позволяет проверить некоторые выражения и вернуть 1 или 0

    Написанное выражение подвергается обработке со стороны BASH как обычная строка, а после передаётся для выполнения в приложение test

    Данное приложение предназначено для использования в if-выражении:

    Данная команда является расширением приложения test и исправляет ряд его ограничений. Рекомендуется к использованию вместо приложения test

    • Внутри команды [[ ]] не происходит расширения строк
    • Можно использовать && , || внутри выражения
    • Легче группировать выражения с помощью (. )

    Команду [[ следует использовать для сравнения строк и проверки файлов

    Комбинирование проверок в test

    Несколько проверок можно объединить с помощью && , || на уровне Bash:

    Операторы && и || работают на уровне результатов работы приложения

    Строковые проверки отличаются

    [[ test Пример
    > \> [[ a > b ]] ложь, a идёт раньше b
    \ [[ az правда, a идёт раньше z
    = , == = [[ a = a ]] правда, a равно a
    != != [[ a != b ]] правда, a не равно b
    = , == нет [[ name = n* ]] правда, name начинается с n
    =~ нет [[ home =~ ^h+ ]] правда, home соответствует выражению
    -z -z [[ -z $info ]] правда, если строка в $info нулевой длины
    -n -n [[ -n $data ]] правда, если строка в $data ненулевой длины

    Числовые проверки между test и [[ не отличаются

    Проверка Пример
    -gt [[ 5 -gt 10 ]] ложь, 5 меньше 10
    -lt [[ 8 -lt 9 ]] правда, 8 меньше 9
    -eq [[ 5 -eq 3 ]] ложь, 5 не равно 3
    -ne [[ 5 -ne 3 ]] правда, 5 не равно 3
    -ge [[ 3 -ge 3 ]] правда, 3 больше или равно 3
    -le [[ 3 -le 8]] правда, 3 меньше или равно 8

    Проверка Пример
    -a [[ -a /tmp/data ]] правда, если файл существует
    -d [[ -d /var/log ]] правда, если директория существует
    -e [[ -e /run/info.pid ]] правда, если файл существует
    -f [[ -f /tmp/test ]] правда, если существует и является файлом
    -r [[ -r ~/info ]] правда, если файл доступен на чтение
    -w [[ -w ~/result ]] правда, если файл доступен на запись
    -x [[ -x ~/bin/run ]] правда, если файл можно выполнять

    Помимо итеративного for в Bash также есть бесконечные циклы while и utlit:

    • Цикл while будет выполнять свои действия пока условия в list-1 верны
    • Цикл until будет выполнять свои действия пока условия в list-1 неверны

    Выйти из цикла можно с помощью break [n] Если передать число, тогда выход будет произведён из такого количества циклов

    Для перехода к следующей итерации можно воспользоваться continue [n] Если передать число, то продолжение будет на соответствующем уровне вложенности

    Bash поддерживает следующие типы переменных:

    • Локальные переменные, которые видны внутри области видимости (файла, функции и т.д.)
    • Переменные окружения, которые видны детским процессам
    • Позиционные переменные

    Переменные окружения

    Для декларирования переменной окружения используется команда export :

    В переменные $0 , $1 , $2 записываются аргументы скрипта

    Команда shift производит “сдвиг” позиционных аргументов влево

    Значение переменной $0 не изменяется

    С помощью этой команды можно обойти все аргументы:

    shift может сдвигать сразу на несколько позиций

    Язык Bash имеет множество отличий в семантике работы от привычных языков программирования, поэтому надо быть осторожным с переносом своих привычек на язык Bash

    Для проверки Bash-кода на наличие проблем рекомендуется использовать статический анализатор кода ShellCheck

    Читайте также: