Руководство по написанию сценариев оболочки для новичков: основы

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

Что такое сценарии оболочки?

Быть пользователем Linux означает, что вы играете с командной строкой. Нравится вам это или нет, но есть некоторые вещи, которые намного легче сделать через этот интерфейс, чем с помощью указателя и щелчка. Чем больше вы используете и изучаете командную строку, тем больше вы видите ее потенциал. Ну, сама командная строка - это программа: оболочка. Сегодня большинство дистрибутивов Linux используют Bash, и именно в него вы вводите команды.

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

Сценарии оболочки позволяют нам программировать команды в цепочках и заставлять систему выполнять их как событие сценария, точно так же, как пакетные файлы. Они также позволяют выполнять гораздо более полезные функции, такие как подстановка команд. Вы можете вызвать команду, например date, и использовать ее вывод как часть схемы именования файлов. Вы можете автоматизировать резервное копирование, и к каждому скопированному файлу может быть добавлена ​​текущая дата в конце его имени. Сценарии - это не просто вызов команд. Они сами по себе программы. Сценарии позволяют вам использовать программные функции, такие как циклы for, операторы if / then / else и т. Д., Непосредственно в интерфейсе вашей операционной системы. И вам не нужно изучать другой язык, потому что вы используете то, что уже знаете: командную строку.

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

Прежде чем вы начнете

Прежде чем мы начнем нашу серию сценариев, давайте рассмотрим некоторую основную информацию. Мы будем использовать оболочку bash, которую большинство дистрибутивов Linux используют изначально. Bash доступен для пользователей Mac OS и Cygwin также для Windows. Поскольку он настолько универсален, вы сможете писать скрипты независимо от вашей платформы. Кроме того, до тех пор, пока существуют все команды, на которые есть ссылки, сценарии могут работать на нескольких платформах, практически не требуя настройки.

Сценарии могут легко использовать права «администратора» или «суперпользователя», поэтому лучше всего протестировать скрипты, прежде чем запускать их. Также руководствуйтесь здравым смыслом, например, убедитесь, что у вас есть резервные копии файлов, над которыми вы собираетесь запустить сценарий. Также очень важно использовать правильные параметры, такие как –i для команды rm, чтобы ваше взаимодействие было обязательным. Это может предотвратить некоторые неприятные ошибки. Поэтому прочитайте загружаемые скрипты и будьте осторожны с имеющимися у вас данными, на случай, если что-то пойдет не так.

По своей сути скрипты - это просто текстовые файлы. Вы можете использовать любой текстовый редактор, чтобы написать их: gedit, emacs, vim, nano… Этот список можно продолжить. Только не забудьте сохранить его как обычный текст, а не как форматированный текст или документ Word. Поскольку мне нравится простота использования, которую обеспечивает nano, я буду использовать это.

Разрешения и имена скриптов

Скрипты выполняются как программы, и для этого у них должны быть соответствующие разрешения. Вы можете сделать скрипты исполняемыми, выполнив на нем следующую команду:

chmod + x ~ / somecrazyfolder / скрипт

Это позволит любому запускать этот конкретный сценарий. Если вы хотите ограничить его использование только своим пользователем, вы можете использовать вместо этого:

chmod u + x ~ / somecrazyfolder / скрипт

Чтобы запустить этот сценарий, вам нужно будет перейти с компакт-диска в соответствующий каталог, а затем запустить сценарий следующим образом:

cd ~ / somecrazyfolder

./script1

Чтобы было удобнее, вы можете поместить скрипты в папку «bin» в вашем домашнем каталоге:

~ / bin

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

Однако перед тем, как дать скрипту имя, вы должны выполнить следующую команду, чтобы проверить, установлена ​​ли у вас программа, использующая это имя:

который [команда]

Многие люди называют свои ранние скрипты «тестовыми», и когда они пытаются запустить его из командной строки, ничего не происходит. Это потому, что она конфликтует с тестовой командой, которая ничего не делает без аргументов. Всегда следите за тем, чтобы имена ваших скриптов не конфликтовали с командами, иначе вы можете обнаружить, что делаете то, чего не собираетесь делать!

Рекомендации по написанию сценариев

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

  1. Каждый скрипт должен содержать «#! / Bin / bash»
  2. Каждая новая строка - это новая команда
  3. Строки комментариев начинаются с символа #
  4. Команды заключены в ()

Взлом Hash-Bang

Когда оболочка анализирует текстовый файл, самый прямой способ идентифицировать файл как сценарий - это сделать вашу первую строку:

#! / bin / bash

Если вы используете другую оболочку, замените ее путь здесь. Строки комментариев начинаются с хэшей (#), но добавление символа bang (!) И пути к оболочке после этого является своего рода взломом, который обойдет это правило комментариев и заставит скрипт выполняться с оболочкой, на которую указывает эта строка.

Новая строка = Новая команда

Каждую новую строку следует рассматривать как новую команду или компонент более крупной системы. Например, операторы if / then / else будут занимать несколько строк, но каждый компонент этой системы находится в новой строке. Не позволяйте команде перетекать в следующую строку, так как это может усечь предыдущую команду и дать вам ошибку в следующей строке. Если ваш текстовый редактор делает это, вы должны отключить перенос текста на всякий случай. Вы можете отключить перенос текста в нанобит, нажав ALT + L.

Комментарий Часто с #s

Если вы начинаете строку с символа #, она игнорируется. Это превращает его в строку комментариев, где вы можете напомнить себе, каким был результат предыдущей команды или что будет делать следующая команда. Опять же, отключите перенос текста или разбейте комментарий на несколько строк, каждая из которых начинается с хеша. Использование большого количества комментариев - хорошая практика, поскольку это позволяет вам и другим людям легче настраивать ваши сценарии. Единственное исключение - вышеупомянутый хакерский метод Hash-Bang, поэтому не ставьте перед #s символами! S. ;-)

Команды заключены в круглые скобки

В прежние времена подстановки команд выполнялись с одинарными отметками (`, разделяет клавишу ~). Мы пока не собираемся касаться этого, но, поскольку большинство людей после изучения основ уходят и исследуют, вероятно, стоит упомянуть, что вместо этого вам следует использовать круглые скобки. Это главным образом потому, что, когда вы вкладываете команды в другие команды, скобки работают лучше.

Ваш первый сценарий

Начнем с простого скрипта, который позволяет копировать файлы и добавлять даты в конец имени файла. Назовем это «datecp». Во-первых, давайте проверим, не конфликтует ли это имя с чем-то:

Как видите, команда which не выводит данные, поэтому мы все настроены на использование этого имени.

Создадим пустой файл в папке ~ / bin:

коснитесь ~ / bin / datecp

И давайте изменим разрешение сейчас, пока не забыли:

Тогда приступим к созданию нашего скрипта. Откройте этот файл в любом текстовом редакторе. Как я уже сказал, мне нравится простота nano.

нано ~ / bin / datecp

И давайте продолжим и добавим предварительную строку и комментарий о том, что делает этот сценарий.

Затем объявим переменную. Если вы когда-либо занимались алгеброй, вы, вероятно, знаете, что это такое. Переменная позволяет нам хранить информацию и что-то с ней делать. Переменные могут «расширяться», если на них есть ссылки в другом месте. То есть вместо отображения своего имени они будут отображать сохраненное содержимое. Позже вы можете указать той же переменной хранить другую информацию, и любая инструкция, которая происходит после этого, будет использовать новую информацию. Это действительно необычный заполнитель.

Что мы будем помещать в переменную out? Что ж, сохраним дату и время! Для этого мы вызовем команду date.

Взгляните на снимок экрана ниже, чтобы узнать, как построить вывод команды date:

Вы можете видеть, что, добавляя различные переменные, начинающиеся с%, вы можете изменить вывод команды на то, что вам нужно. Для получения дополнительной информации вы можете посмотреть страницу руководства для команды date.

Давайте воспользуемся последней итерацией команды date, «date +% m_% d_% y-% H.% M.% S», и воспользуемся ею в нашем скрипте.

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

Но давайте сделаем что-нибудь другое. Дадим этой команде имя переменной, например date_formatted. Правильный синтаксис для этого следующий:

переменная = $ (команда – параметры аргументы)

А для нас мы бы построили это так:

date_formatted = $ (дата +% m_% d_% y-% H.% M.% S)

Это то, что мы называем подстановкой команд. По сути, мы говорим bash, что всякий раз, когда появляется переменная date_formatted, нужно запускать команду в круглых скобках. Затем любой вывод команд должен отображаться вместо имени переменной «date_formatted».

Вот пример сценария и его вывод:

Обратите внимание, что в выводе есть два пробела. Отображаются как пробел в кавычках команды echo, так и пробел перед переменной. Не используйте пробелы, если не хотите, чтобы они появлялись. Также обратите внимание, что без этой добавленной строки «эхо» сценарий не дал бы абсолютно никакого вывода.

Вернемся к нашему сценарию. Теперь давайте добавим копирующую часть команды.

cp –iv $ 1 $ 2. $ date_formatted

Это вызовет команду копирования с параметрами –i и –v. Первый запросит у вас подтверждение перед перезаписью файла, а второй отобразит в командной строке, что происходит.

Далее вы можете видеть, что я добавил опцию «$ 1». При написании сценария знак доллара ($), за которым следует номер, будет обозначать этот пронумерованный аргумент сценария, когда он был вызван. Например, в следующей команде:

cp –iv Trogdor2.mp3 ringtone.mp3

Первый аргумент - «Trogdor2.mp3», а второй аргумент - «ringtone.mp3».

Оглядываясь на наш сценарий, мы видим, что ссылаемся на два аргумента:

Это означает, что при запуске сценария нам необходимо предоставить два аргумента для правильного выполнения сценария. Первый аргумент, $ 1, - это файл, который будет скопирован, и подставляется в качестве первого аргумента команды «cp –iv».

Второй аргумент, $ 2, будет выступать в качестве выходного файла для той же команды. Но вы также можете видеть, что это другое. Мы добавили точку и ссылались на переменную date_formatted сверху. Любопытно, что это делает?

Вот что происходит при запуске скрипта:

Вы можете видеть, что в выходном файле указано то, что я ввел за 2 доллара, за которым следует точка, а затем результат команды даты! Имеет смысл, правда?

Теперь, когда я запускаю команду datecp, она запускает этот сценарий и позволяет мне копировать любой файл в новое место и автоматически добавлять дату и время в конец имени файла. Полезно для архивирования!

Сценарии оболочки лежат в основе работы вашей ОС. Вам также не нужно изучать новый язык программирования, чтобы это произошло. Попробуйте написать дома некоторые базовые команды и подумайте, для чего это можно использовать.

Вы пишете сценарий? Есть какие-нибудь советы для новичков? Поделитесь своими мыслями в комментариях! В этой серии будет больше!