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