Программирование

Bash. Часть 1. Скрипты и переменные

В текущей статье будут рассмотрены основы использования Bash, от простых команд до написания скриптов. Узнаем, как создавать и запускать скрипты, работать с переменными и параметрами. Статья станет отличным руководством для начинающих разработчиков и системных администраторов, которые хотят лучше понять основы работы с Bash.

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

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

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

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

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

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

# !/bin/bash
echo "Hello world"

Итак, любой 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 file.txt
ssh

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

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

exit

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

export

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

hash

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

kill

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

read

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

return

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

shift

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

test

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

times

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

trap

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

unset

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

wait

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

Переменные

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

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

  • переменные среды
  • пользовательские переменные
#!/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


Источник:
https://cs.mipt.ru/gertsev/os-linux/lessons/07_Scripts_Bash.html