Как сделать комментарий в bash сценарии

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

этот файл сценария с одной командой BASH трудно понять, поэтому я хочу написать комментарий для каждого из действий:

(sed это только пример, на самом деле это смесь greps и trs и awks)

мне не хотелось бы дублировать строки или иметь каждый комментарий далеко от строки, к которой он применяется.

Но в то же время BASH, похоже, не допускает "встроенных" комментариев.

любой элегантный способ решить эту проблема?

поместите трубы в конец строки с комментариями после нее:

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

Если вы не делаете что-то действительно извращенное, как автоматизация комментирования, я не вижу причин предпочитать это над ответом Микеля для трубы, но если вы действительно хотели:

Я недавно начал изучать скрипт и я'd как, чтобы иметь возможность комментировать набор строк в shell-скрипт. Я имею в виду, как в случае c/Ява :

Как я мог это сделать?

Использование: ' открыть и '` чтобы закрыть.

Многострочный комментарий в bash

Баш не обеспечивает встроенная, но есть хаки, используя существующие синтаксисе bash. Самый простой способ-это использовать помощи heredoc, но сделать это очевидным, что вы делаете, и использовать тот же маркер помощи heredoc везде:

Некоторые посты упомянуть, что помощи heredoc маркера должны быть заключены в кавычки для того, чтобы избежать парсинга побочные эффекты оболочки. Я только нашел, что это необходимо, если вы используете backquotes в ваш комментарий. Даже с взаимозачета переменных$многословный и``, упомянутые в комментариях, со ссылкой на маркер не надо. YMMV.

Оба писаки, чтобы они могли разрушить сценарии в будущем.

Есть, конечно, и другие методы, но там не'т, кажется, а "обычные" и способ, как это сделать.

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

Что такое bash-скрипты

Bash-скрипт (от англ. script — сценарий) — это последовательность команд, которые по очереди считывает и выполняет интерпретатор. В нашем случае это командная строка — bash.

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

Разберем на примере

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

Теперь давайте разбираться, как всё устроено, с помощью командой строки. Ниже — объяснение, что тут происходит.

Шебанг

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

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

Linux — это ОС без расширений. Это значит, что мы можем назвать наш скрипт как угодно, и это никак не повлияет на его выполнение. Обычно для скриптов все-таки записывают расширение .sh, но это делатеся исключитьельно для удобства. Наш скрипт можно было назвать и просто myscript или даже myscript.jpg — он бы всё равно работал так же.

Комментарии

Обычно принято в верхней части скрипта оставлять комментарий с кратким описанием того, что делает сценарий, а также кто и когда его написал.

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

Зачем мы используем ./

Когда мы вводим команду в терминале, система проходит по заданному ряду каталогов в поисках этой команды. Этот путь можно увидеть с помощью переменной PATH .

Сначала система ищет команду в первой директории. Если она там есть, команда запускается, если нет — система проверяет вторую директорию и так далее. Каталоги разделяются : (двоеточие).

Мы можем также использовать абсолютный путь /home/karpaff/linuxtutorialwork/myscript.sh или относительный путь, если мы не находимся в той же директории, что и скрипт ../linuxtutorialwork/myscript.sh .

Если бы можно было запускать скрипты в текущем каталоге без этого механизма, то злоумышленники могли бы легко создать вредоносный скрипт в определенном каталоге и назвать его ls, например. Если бы пользователь захотел посмотреть содержимое этого каталога, он бы мог случайно запустить этот опасный скрипт.

Разрешения

Для запуска у сценария должно быть разрешение на выполнение — даже если вы являетесь владельцем файла. По соображениям безопасности, по умолчанию у вас нет разрешения execute, поэтому его необходимо добавить. Чтобы убедиться, что ваш скрипт настроен правильно, можно ввести команду chmod 755 .

Переменные

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

• Когда мы ссылаемся на переменную, нужно поставить $ (знак доллара) перед именем переменной.

Разберемся на примере:

Переменные, связанные с параметрами

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

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

Разберемся на примере:

Переменная, содержащая вывод команды

Вывод команды тоже мождно сохранить в переменную — для этого используется ` (обратный апостроф).

Примечание. Обратите внимание, что это именно обратный апостроф, а не одинарная кавычка. Обычно обратный апостроф находится на клавиатуре на букве ё — слева от клавиши 1.

Разберемся на примере:

Создаем резервные копии с помощью скрипта

Теперь давайте используем всё, что мы изучили, в сценарий, который действительно делает что-то полезное. Допустим, вы храните все свои проекты в отдельных каталогах в директории под названием Projects, которая лежит в домашнем каталоге. Вам нужно регулярно делать резервные копии этих проектов и хранить их в датированных папках в каталоге под названием Projectbackups — она тоже в домашнем каталоге.

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

Оператор условия if

Давайте разберемся, что здесь происходит:

Примечание. Обратите внимание, что некоторые строки в нашем коде имеют отступы. Это не обязательно делать, но оступы — хорошая привычка: так код читать гораздо легче.

Совет. Конструция if на самом деле использует команду test. Если вы хотите узнать обо всех возможных сравнениях загляните на страницу руководства для команды test.

Что нужно запомнить

Команды

which
Выводит путь к определенной команде.

$
Позволяет обращаться к значению переменной.

` `
Обратные апострофы. Сохраняют вывод команды в переменную.

date
Выводит на экран дату.

if [ ] then else fi
Условная конструкция.

В скрипте — обычные команды
Всё, что вы можете сделать в командной строке, можно реализовать в сценарии с тем же результатом — и наоборот.

Форматирование важно
Bash-скрипты чутки к форматированию. Убедитесь, что пробелы есть там, где они нужны, и отсутсвуют там, где они не нужны.

Практические задания

2. Напишите скрипит, который будет предоставлять отчёт об определенной папке. Вот, на какие вопросы должен отвечать ваш скрипт:

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

Что такое терминал?

Терминал — это программа, которая используется для взаимодействия с шеллом. Это просто интерфейс к нему и другим программам командной строки, которые работают внутри нее. Вот как выглядит типичный терминал (Konsole) в Debian 11 (окружение рабочего стола — KDE Plasma):


Типичный терминал в Linux

Всякий раз, когда мы открываем окно терминала, мы видим приглашение шелла — имя_пользователя@имя_машины:~$ . Символ $ означает, что мы работаем под учетной записью обычного пользователя, а символ ~ (тильда) означает, что в данный момент мы находимся в домашнем каталоге /home/ .

Команды в bash

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

Команда echo — возвращает всё, что вы вводите в командной строке:


Пример использования команды echo

Команда date — отображает текущее время и дату:

Пример использования команды date

Файловая иерархия в Linux имеет древовидную структуру, поэтому, чтобы добраться до указанного каталога или файла, нам нужно пройти определенный путь, каждый узел которого отделен от других узлов символом / .


Пример использования команды pwd


Пример использования команды ls

cd — меняет текущую директорию на заданную. Давайте попробуем с помощью команды ls перейти к корневому каталогу / и ознакомимся с его содержимым. Обратите внимание, что мы также можем использовать точку с запятой ; для записи двух команд в одной строке.


Пример объединения двух команд в одной строке

cd .. — вернуться в родительский каталог.

cd — вернуться в домашний каталог.


Перемещение файлов с помощью команды mv

Команда touch — создает новые пустые файлы (а также изменяет временные метки в существующих файлах и каталогах). Вот как мы можем создать пустой файл под названием foo.txt в папке Ravesli из домашнего каталога:


Создание файла с помощью команды touch

Давайте удалим ранее созданный файл foo.txt:


Удаление файла с помощью команды rm

Давайте удалим созданный ранее каталог /home/diego/Ravesli:


Удаление каталогов с помощью команды rmdir


Пример использования команды cat

Чтобы просмотреть несколько файлов, укажите друг за другом (через пробел) имена требуемых файлов после команды cat , например:


Просмотр нескольких файлов с помощью команды cat


Отображение справочной информации с помощью команды man

Редактор nano

nano — это маленький, простой, консольный текстовый редактор *nix-подобных операционных систем, впервые увидевший свет в далеком 1999 году. Для запуска редактора достаточно ввести в терминале всего одну команду — nano . Если же нужно отредактировать какой-то конкретный файл, то применяется команда nanо / . Отличительной чертой данного редактора является то, что он управляется сочетаниями клавиш. Например, для сохранения текущего документа применяется сочетание Ctrl+O, для вызова меню поиска — Ctrl+W, для выхода из редактора — Ctrl+X, а для получения всего списка доступных сочетаний клавиш — Ctrl+G.



Гайд по созданию bash-скриптов

Наш шелл, это не только промежуточное звено между пользователем и системой, но еще и мощный язык программирования. Программы, написанные на языке шелла, называются shell-скриптами (или shell-сценариями) и имеют соответствующее расширение файлов — .sh. Сам язык содержит полный набор утилит и команд, доступных в *nix-системах, а также циклы, условные операторы, объявление переменных и пр. Такие скрипты будут очень полезными там, где не требуется использование полноценных языков программирования, например, в задачах администрирования операционной системы.

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

Чтобы создать новый файл bash-скрипта, откройте в любом редакторе текстовый файл и сохраните его с расширением .sh. Все дальнейшие эксперименты я будут проводить в Debian Linux, с применением текстового редактора nano.

Давайте создадим новый файл ravesli.sh:

diego@debian:~$ touch ravesli.sh
diego@debian:~$ ls -l
-rw-r--r-- 1 diego diego 0 мар 9 14:59 ravesli.sh
diego@debian:~$

Чтобы выполнить файл bash-скрипта, нужно изменить права доступа к файлу и сделать его исполняемым. Разрешение, как вы наверняка помните из предыдущих уроков, изменяется командой chmod +x :

diego@debian:~$ chmod +x ravesli.sh
diego@debian:~$ ls -l
итого 40
drwxr-xr-x 2 diego diego 4096 фев 27 00:23 build-untitled-Desktop-Debug
-rw x r- x r- x 1 diego diego 0 мар 9 14:59 ravesli.sh

Выполнение bash-скрипта

Файл bash-скрипта может быть запущен двумя способами:

Способ №1: bash . Чтобы выполнить скрипт, просто напишите в терминале команду bash , а затем (через пробел) имя файла и нажмите Enter.

Способ №2: ./ . Чтобы выполнить скрипт введите команду ./ и нажмите Enter.

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

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

Основы скриптов

Скрипт или как его еще называют - сценарий, это последовательность команд, которые по очереди считывает и выполняет программа-интерпретатор, в нашем случае это программа командной строки - bash.

Скрипт - это обычный текстовый файл, в котором перечислены обычные команды, которые мы привыкли вводить вручную, а также указанна программа, которая будет их выполнять. Загрузчик, который будет выполнять скрипт не умеет работать с переменными окружения, поэтому ему нужно передать точный путь к программе, которую нужно запустить. А дальше он уже передаст ваш скрипт этой программе и начнется выполнение.

Простейший пример скрипта для командной оболочки Bash:

bash1

Утилита echo выводит строку, переданную ей в параметре на экран. Первая строка особая, она задает программу, которая будет выполнять команды. Вообще говоря, мы можем создать скрипт на любом другом языке программирования и указать нужный интерпретатор, например, на python:

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

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

chmod ugo+x файл_скрипта

Теперь выполняем нашу небольшую первую программу:

bash

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

Переменные в скриптах

Написание скриптов на Bash редко обходится без сохранения временных данных, а значит создания переменных. Без переменных не обходится ни один язык программирования и наш примитивный язык командной оболочки тоже.

Возможно, вы уже раньше встречались с переменными окружения. Так вот, это те же самые переменные и работают они аналогично.

Например, объявим переменную string:

Значение нашей строки в кавычках. Но на самом деле кавычки не всегда нужны. Здесь сохраняется главный принцип bash - пробел - это специальный символ, разделитель, поэтому если не использовать кавычки world уже будет считаться отдельной командой, по той же причине мы не ставим пробелов перед и после знака равно.

Чтобы вывести значение переменной используется символ $. Например:

Модифицируем наш скрипт:

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

bash2

Обратите внимание, что как я и говорил, кавычки необязательны если в строке нет спецсимволов. Присмотритесь к обоим способам слияния строк, здесь тоже демонстрируется роль кавычек. Если же вам нужны более сложные способы обработки строк или арифметические операции, это не входит в возможности оболочки, для этого используются обычные утилиты.

Переменные и вывод команд

Переменные не были бы настолько полезны, если бы в них невозможно было записать результат выполнения утилит. Для этого используется такой синтаксис:

$( команда )

С помощью этой конструкции вывод команды будет перенаправлен прямо туда, откуда она была вызвана, а не на экран. Например, утилита date возвращает текущую дату. Эти команды эквивалентны:

bash3

Понимаете? Напишем скрипт, где будет выводиться hello world и дата:

bash4

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

Параметры скрипта

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

Переменная с именем 1 содержит значение первого параметра, переменная 2, второго и так далее. Этот bash скрипт выведет значение первого параметра:

bash6

bash5

Управляющие конструкции в скриптах

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

В Bash для проверки условий есть команда Синтаксис ее такой:

if команда_условие
then
команда
else
команда
fi

Эта команда проверяет код завершения команды условия, и если 0 (успех) то выполняет команду или несколько команд после слова then, если код завершения 1 выполняется блок else, fi означает завершение блока команд.

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

[[ параметр1 оператор параметр2 ]]

Для сравнения используются уже привычные нам операторы ,=,!= и т д. Если выражение верно, команда вернет 0, если нет - 1. Вы можете немного протестировать ее поведение в терминале. Код возврата последней команды хранится в переменной $?:

bash7

Теперь объединением все это и получим скрипт с условным выражением:

bash8

bash9

Конечно, у этой конструкции более мощные возможности, но это слишком сложно чтобы рассматривать их в этой статье. Возможно, я напишу об этом потом. А пока перейдем к циклам.

Циклы в скриптах

Преимущество программ в том, что мы можем в несколько строчек указать какие действия нужно выполнить несколько раз. Например, возможно написание скриптов на bash, которые состоят всего из нескольких строчек, а выполняются часами, анализируя параметры и выполняя нужные действия.

Первым рассмотрим цикл for. Вот его синтаксис:

for переменная in список
do
команда
done

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

Например, переберем пять цифр:

bash10

bash11

Или вы можете перечислить все файлы из текущей директории:

for file in $(ls -l); do echo "$file"; done

bash12

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

Второй цикл, который мы рассмотрим - это цикл while, он выполняется пока команда условия возвращает код 0, успех. Рассмотрим синтаксис:

while команда условие
do
команда
done

bash14

bash13

Как видите, все выполняется, команда let просто выполняет указанную математическую операцию, в нашем случае увеличивает значение переменной на единицу.

Хотелось бы отметить еще кое-что. Такие конструкции, как while, for, if рассчитаны на запись в несколько строк, и если вы попытаетесь их записать в одну строку, то получите ошибку. Но тем не менее это возможно, для этого там, где должен быть перевод строки ставьте точку с запятой ";". Например, предыдущий цикл можно было выполнить в виде одной строки:

index=1; while [[ $index

Выводы

Теперь вы понимаете основы создания скрипта в linux и можете написать нужный вам скрипт, например, для резервного копирования. Я пытался рассматривать bash скрипты с нуля. Поэтому далеко не все аспекты были рассмотрены. Возможно, мы еще вернемся к этой теме в одной из следующих статей.

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