Статья также доступна на украинском (перейти к просмотру).

Содержание
В предыдущей статье мы обсудили базовые понятия работы с Bash-скриптами. Теперь давайте подробнее поговорим о языковых конструкциях и переменных в Bash.
Возможности bash позволяют контролировать состояние программной среды, создавать сценарии и управлять их исполнением. Все это становится возможным, в частности благодаря поддержке внутренних и внешних переменных, наличию специальных конструкций и операторов. Каждый элемент указанного арсенала имеет свой собственный синтаксис и правила использования. Рассмотрим их и проверим в действии.
Переменные
В bash отсутствуют типы данных. Все переменные, которые используются, можно разделить на внутренние или устроенные в оболочку и внешние, которые создаются пользователем для различных задач. И хотя они имеют разное происхождение и предназначение, принцип их использования одинаков. Признаком переменной является наличие символа $ впереди ее названия. Любая переменная может сохранять числовые значения, отдельные символы или строки символов. Рассмотрим правила и примеры использования обоих видов переменных.
Внутренние переменные
Внутренние переменные сохраняют значения системных параметров, необходимых для настройки требуемой конфигурации среды и получения системной информации. Примеры наиболее употребляемых переменных:
- $BASH_VERSION – сохраняет версию оболочки;
- $HOME – домашний каталог пользователя;
- $GROUPS – названия групп, к которым принадлежит текущий пользователь;
- $HOSTTYPE – идентификация аппаратной архитектуры машины;
- $PS1 – приглашение командной строки;
- $PATH – путь поиска исполнительных файлов, используемый оболочкой;
- $PPID – идентификатор родительского процесса;
- $PWD – текущий каталог;
- $SECONDS – время работы сценария.
Рассмотрим использование некоторых из них. Например, одной из важнейших является переменная $PATH.Ее использование повышает гибкость и безопасность систем Linux. Она служит для указания bash где искать исполнительные файлы. Обычно такие файлы находятся в каталогах /bin, которых может быть несколько в разных местах. Это позволяет не указывать полный путь к программе в командной строке, а только ее название. Значение переменной загружается в память при загрузке файлов конфигурации оболочки. Таких файлов есть несколько, но какой из них «прочитается» оболочкой зависит от того, каким образом была произведена регистрация в системе. Вот эти файлы:
/etc/bash.bashrc – глобальный файл сценария конфигурации оболочки;
~ /.bashrc – персональный файл конфигурации;
~ /.bash_profile – файл инициализации пользователя;
/etc/profile – глобальный файл инициализации.
Просмотрим существующее в настоящее время значение указанной переменной. Для этого введем в терминале:
$ echo $PATH

Мы видим директории, настроенные в $PATH по умолчанию. Все они перечислены через двоеточие. Существует еще один способ пересмотреть значение переменной:
$ printenv PATH

Как видим, результат одинаков. Еще один способ узнать путь к исполнительному файлу программы, это использование специальной команды, which вместе с нужной программой. Введем в терминале:
$ which whoami

Мы получили путь к местонахождению исполнительных файлов программы whoami
Можно временно добавить каталог в $PATH. Это значение будет действовать только во время работы текущего сеанса терминала. При закрытии терминала каталог автоматически удаляется. Для добавления нового каталога используем команду export:
$ export PATH="/NewDirectory:$PATH"

Проверим текущее значение переменной:
$ echo $PATH

Итак, новый каталог добавлен.
Можно добавить новый каталог, отредактировав указанные выше конфигурационные файлы с помощью одного из редакторов текста, например, nano. Чтобы добавить новый каталог только для текущего пользователя системы, необходимо отредактировать персональный файл конфигурации. Введем в терминале:
$ nano .bashrc


Сохраним внесенные изменения и выйдем из редактора (ctrl+O, ctrl+X). Для того чтобы изменения немедленно начали действовать, необходимо перезагрузить указанный файл:
$ source .bashrc

После этого внесенные изменения вступили в силу.
Если же мы хотим добавить каталог для всех пользователей системы, то необходимо отредактировать глобальный файл инициализации /etc/profile.
Так же мы можем просматривать и изменять значения других внутренних сменных оболочек. Например, просмотрим тип аппаратной архитектуры нашего сервера:
$ echo $HOSTTYPE

Результат – x86_64. Вообще же, если нам нужно просмотреть значение всех переменных программной среды, то можно воспользоваться командой printenv:
$ printenv

Как видно, значения нескольких внутренних переменных выведены на терминал.
Наружные переменные
Внешние переменные создаются пользователем в основном для использования в сценариях. Для их корректного использования следует придерживаться установленных договоренностей относительно имен переменных:
- Имена должны начинаться с буквы или символа подчеркивания;
- В составе имени могут быть только буквы, цифры и символы подчеркивания;
- Учитывается регистр символов;
- Использование пробелов и специальных символов запрещено;
- Нельзя использовать зарезервированные системой слова, которые используются для названия языковых конструкций и системных переменных.
Например, приведем корректные названия переменных:
Gora_
_fazan
mmm
Некорректные названия:
Ind-us(используется запрещенный символ «-»)
12345r (название начинается с цифры)
gh hhd (присутствует пробел в середине названия)
Присвоить значение, то есть, в сущности, создать новую переменную можно двумя путями – прямое присвоение и присвоение результатов работы команды или программы путем подстановки.
Пример прямого присвоения:
town=Buenos_Aires
Приклад подстановки:
new_town=$town
Здесь значение переменной $town передалось новой переменной $new_town. Продемонстрируем это в терминале:

Обращаем внимание, что пробелы между переменными и их значениями недопустимы. Например, попытаемся присвоить значение, то есть создать переменную с использованием пробелов в команде:
town = Buenos_Aires

Как видим, интерпретатор bash воспринимает «town» как команду, а поскольку такой команды не существует, то он выводит сообщение о том, что такая команда не найдена. Следовательно, это следует учитывать в дальнейшем.
Конструкции для ввода, вывода и перенаправления данных
Ввод данных
Рассмотрим сначала конструкции для ввода. Ввод данных может быть осуществлен из нескольких источников:
- С клавиатуры пользователем (пользовательский);
- Из файла;
- За счет использования аргументов командной строки.
Пользовательский ввод данных возможен благодаря наличию оператора read. Продемонстрируем это. Наберем в терминале:
$ echo "На каком курсе университета Вы учитесь?" $ read kurs

Результат ввода двух команд можно видеть на скриншоте. Система ожидает ввода данных от пользователя. После их ввода и подтверждения ввода клавишей Enter результат будет следующим:

То есть команда автоматически вывела результат. Проверим, сохранилось ли значение переменной $kurs в памяти. Для этого введем команду вывода:
$ echo $kurs

Да, значение сохранилось. Это означает, что переменные можно использовать в сценариях. Сформируем сценарий из использованных нами команд. Для этого вызовем редактор и введем в него следующие строчки:
#!/bin/bash echo "На каком курсе университета Вы учитесь?" read kurs echo "Разумеется, значит Вы учитесь на $kurs курсе" $ nano lesson_1.sh

Сохраним файл и запустим его во исполнение:
$ bash lesson_1.sh
После запуска сценария появляется просьба ввести данные и система находится в режиме ожидания ввода.

Конечный результат работы сценария показан ниже.

Можно убедиться, что переменная $kurs, которая была вставлена ??в последнюю строчку, успешно сработала.
Считывание данных из файла применяется при необходимости вывести результаты на терминал или в другой файл или устройство. Для этой цели существует специальная конструкция «<». Применим эту конструкцию в нашем новом сценарии, предназначенном для вывода на терминал каждой строчки файла с именем text.txt. Вызовем редактор и вставим в него код, приведенный ниже:
#!/bin/bash while read newline do echo $newline done < text.txt $ nano lesson_2.sh

Сохраним внесенные изменения и закроем файл сценария. После этого запустим его во исполнение:
$ bash lesson_2.sh

В итоге, любая строчка текстового файла выведена на терминал, как это планировалось.
Аргументы командной строчкиявляются еще одним удачным способом работы с переменными. Сущность его состоит в последовательной нумерации передаваемых скрипта или функции параметров, или переменных. Благодаря этому такие переменные можно легко идентифицировать в пределах кода. Это выглядит так:
$1, $2, $3 .... $N
К примеру, создадим новый файл сценария с именем lesson_3 и поместим в него следующий код:
#!/bin/bash echo "Сегодня у нас будет занятие по теме $1" echo "Завтра у нас будет занятие по теме $2" echo "Послезавтра у нас будет занятие на тему $3" $ nano lesson_3.sh

Сохраним внесенные изменения и закроем файл. После этого запустим созданный скрипт для выполнения с передачей трех параметров, как показано ниже:
$ bash lesson_3.sh Php C++ JavaScript

Как видно из скриншота, все параметры были успешно переданы и идентифицированы, то есть метод аргументов работает.
Вывод данных
Вывод на терминал можно обеспечить с помощью команды echo, работу с которой мы уже не раз демонстрировали.
Для вывода или записи информации в файл в bash применяется конструкция «>», являющаяся зеркальным отображением конструкции для ввода. Например, запишем текстовую информацию в файл text2.txt. Введем в терминале:
$ echo "Текст для записи в файл." > text2.txt

Теперь проверим содержимое файла с помощью команды cat (вывод содержимого файла):
$ cat text2.txt

Можно убедиться, что запись информации прошла успешно.
Информацию можно также добавить в конец любого файла. Для этого существует конструкция «>>». Воспользуемся ею и добавим дополнительные данные в наш файл. Введем:
$ echo "Дополнительный текст для записи в файл." >> text2.txt

Снова проверим содержимое файла:
$ cat text2.txt

Как видим, текст успешно прибавился в конец существующих записей.
Еще один способ вывода информации – это ее перенаправление. Например, перенаправим результаты выполнения команды в определенный файл. Введем в терминале:
$ ls > ls_info.txt

Произведем проверку:
$ cat ls_info.txt

Можно убедиться в успешности проделанной операции.
В следующий раз мы поговорим об условных операторах, циклах и других инструментах bash, позволяющих ей быть гибкой и эффективной. Следите за нашим телеграм каналом.
Дата-центр FREEhost.UA предоставляет услуги по аренде серверного оборудования в Украине с 2003 года. У нас Вы можете подобрать сервер под разные задачи, со стоимостью от 700 грн. на месяц. Наши специалисты готовы помочь в обслуживании оборудования и настройке программного обеспечения. Переходите на страницу со списком конфигураций и выбирайте наиболее подходящий для Вас вариант.
Смотрите наш канал Youtube на https://www.youtube.com/freehostua.
Ми в чем то ошиблись или что то пропустили?
Напишите об этом в комментариях, мы с удовольствием ответим и обговорим Ваши замечания и предложения.
|
Дата: 04.04.2023 Автор: Александр Ровник
|
|

Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:
comments powered by Disqus