Скрипты и переменные в bash

Теоретическое введение

Оболочка, или шелл (shell) — это программа, принимает ваши команды и передаёт их операционной системе. BASH расшифровывается как Bourne-Again SHell (что может переводится как «перерожденный шел»).

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

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

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

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

# !/bin/bash
echo "Please I want a good grade"

Итак, любой bash-скрипт должен начинаться со строки:

#!/bin/bash

В этой строке после #! указывается путь к bash-интерпретатору, поэтому если вдруг он находится в другой директории – необходимо поменять путь. Проверить, где он находится можно, набрав whereis bash

Команды оболочки отделяются знаком перевода строки, комментарии выделяют знаком решётки. Как и в командной строке, в Bash можно записывать команды в одной строке, разделяя точкой с запятой.

Нужно отметить, что перед тем как запустить скрипт Сейчас осталось лишь сделать этот файл исполняемым, иначе, попытавшись его запустить, вы столкнётесь с ошибкой Permission denied.

Чтобы сделать файл исполняемым, необходимо набрать

chmod +x ./myscript

Теперь, после настройки разрешений, все будет работать как надо.

Основные команды.

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

pwd

Команда pwd (сокращение от print working directory) отображает текущее местоположение в структуре каталогов.

cd

Команда cd позволяет перейти в новый каталог.

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

cd ~ позволяет перейти в домашний каталог

cd .. позволяет перейти на 1 уровень выше

mkdir

Команда mkdir создаёт новый каталог в текущем каталоге.

echo

Команда echo выводит свои аргументы по стандартному каналу вывода

cat

Если вам необходимо проверить содержимое определенного файла, к примеру hosting.txt, достаточно воспользоваться командой cat. Это выглядит примерно так:

cat hosting.txt

ssh

Данная команда является протоколом подключения к серверу.

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

ssh -p 55078 b0690613@remote.vdi.mipt.ru
head

Команда head читает первые 10 строк любого переданного текста и выводит их по стандартному каналу.

tail
Команда tail работает аналогично команде head, но читает строки с конца
ps

Команда ps выводит информацию о запущенных процессах.

Выводится четыре элемента:

  • ID процесса (PID),
  • тип терминала (TTY),
  • время работы процесса (TIME),
  • имя команды, запустившей процесс (CMD).
awk

Команда awk находит и заменяет текст в файлах по заданному шаблону:

awk 'pattern {action}' test.txt
wget

Команда wget скачивает файлы из Сети и помещает их в текущий каталог.

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

break - выход из цикла for, while или until

continue - выполнение следующей итерации цикла for, while или until

echo - вывод аргументов, разделенных пробелами, на стандартное устройство вывода

exit - выход из оболочки

export - отмечает аргументы как переменные для передачи в дочерние процессы в среде

hash - запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении

kill - посылает сигнал завершения процессу

pwd - выводит текущий рабочий каталог

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

return - заставляет функцию оболочки выйти с указанным значением

shift - перемещает позиционные параметры налево

test - вычисляет условное выражение

times - выводит имя пользователя и системное время, использованное оболочкой и ее потомками

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

unset - вызывает уничтожение переменных оболочки

wait - ждет выхода из дочернего процесса и сообщает выходное состояние.

Переменные.

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

Существуют два типа переменных, которые можно использовать в bash-скриптах:

  1. Переменные среды
  2. Пользовательские переменные
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"

В этом коротком скрипте HOME является переменной среды. Можно заметить, что она находится в двойных кавычках, это не помешает системе её распознать.

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

echo "I have \$1 in my pocket"

В дополнение к переменным среды, bash-скрипты позволяют задавать и использовать в сценарии собственные переменные. Подобные переменные хранят значение до тех пор, пока не завершится выполнение сценария.

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

#!/bin/bash
# testing variables
grade=7
student="Alexey"
echo "$student worked hard this semester, his grade will be $grade or more"

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

Сделать это можно двумя способами.

  • С помощью значка обратного апострофа «`»
  • С помощью конструкции $()

Приведем пример скрипта, содержащего вторую конструкцию

#!/bin/bash
mydir=$(pwd)
echo $mydir

В ходе его работы вывод команды pwd будет сохранён в переменной mydir, содержимое которой, с помощью команды echo, попадёт в консоль.

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

#!/bin/bash
string1="hello "
string2= "world"
string=$string1$string2

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

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

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

#!/bin/bash
echo $1