• База знаний
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

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

Языковые конструкции и внутренние переменные Bash

Содержание

В предыдущей статье мы обсудили базовые понятия работы с 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

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

$ printenv PATH

Еще один метод проверки значения переменной

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

$ which whoami

Определение пути к исполнительному файлу

Мы получили путь к местонахождению исполнительных файлов программы whoami

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

$ export PATH="/NewDirectory:$PATH"

Добавление временного каталога.

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

$ echo $PATH

Проверка значения переменной

Итак, новый каталог добавлен.

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

$ nano .bashrc

Открытие файла редактором nano

Редактирование файла .bashrc в редакторе nano

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

$ source .bashrc

Перезагрузка файла

После этого внесенные изменения вступили в силу.

Если же мы хотим добавить каталог для всех пользователей системы, то необходимо отредактировать глобальный файл инициализации /etc/profile.

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

$ echo $HOSTTYPE

Проверка значения переменной $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

Использование оператора read

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

Ввнесения значения в переменную  kurs

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

$ echo $kurs

Проверка значенния переменной $kurs

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

#!/bin/bash
echo  "На каком курсе университета Вы учитесь?"
read kurs
echo  "Разумеется, значит Вы учитесь на $kurs курсе"

$ nano lesson_1.sh

Редактирование файла lesson_1.sh

Сохраним файл и запустим его во исполнение:

$ bash lesson_1.sh

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

Запуск файла lesson_1.sh

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

Результат исполнения сценарция

Можно убедиться, что переменная $kurs, которая была вставлена ??в последнюю строчку, успешно сработала.

Считывание данных из файла применяется при необходимости вывести результаты на терминал или в другой файл или устройство. Для этой цели существует специальная конструкция «<». Применим эту конструкцию в нашем новом сценарии, предназначенном для вывода на терминал каждой строчки файла с именем text.txt. Вызовем редактор и вставим в него код, приведенный ниже:

#!/bin/bash
while read newline
do	
  echo $newline
done < text.txt

$ nano lesson_2.sh

Редактирование файла lesson_2.sh

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

$ bash lesson_2.sh

Запуск файла lesson_2.sh и результат его исполнения

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

Аргументы командной строчкиявляются еще одним удачным способом работы с переменными. Сущность его состоит в последовательной нумерации передаваемых скрипта или функции параметров, или переменных. Благодаря этому такие переменные можно легко идентифицировать в пределах кода. Это выглядит так:

$1, $2, $3 .... $N

К примеру, создадим новый файл сценария с именем lesson_3 и поместим в него следующий код:

#!/bin/bash
echo "Сегодня у нас будет занятие по теме $1"
echo "Завтра у нас будет занятие по теме $2"
echo "Послезавтра у нас будет занятие на тему $3"

$ nano lesson_3.sh

Редактирование файла lesson_3.sh

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

$ bash lesson_3.sh Php C++ JavaScript

Запуск файла lsson_3.sh с передачей указанных параметров

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

Вывод данных

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

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

$ echo "Текст для записи в файл." > text2.txt

Внесение данных у файл text2.txt

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

$ cat text2.txt

Вывод содержимого файла text2.txt

Можно убедиться, что запись информации прошла успешно.

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

$ echo "Дополнительный текст для записи в файл." >> text2.txt

Добавление текста в конец файла

Снова проверим содержимое файла:

$ cat text2.txt

Вивод содержимого файла

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

Еще один способ вывода информации – это ее перенаправление. Например, перенаправим результаты выполнения команды в определенный файл. Введем в терминале:

$ ls > ls_info.txt

Перенаправление информации в определенный файл.

Произведем проверку:

$ cat ls_info.txt

Вивод содержимого файла ls_info.txt

Можно убедиться в успешности проделанной операции.

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

Дата-центр FREEhost.UA предоставляет услуги по аренде серверного оборудования в Украине с 2003 года. У нас Вы можете подобрать сервер под разные задачи, со стоимостью от 700 грн. на месяц. Наши специалисты готовы помочь в обслуживании оборудования и настройке программного обеспечения. Переходите на страницу со списком конфигураций и выбирайте наиболее подходящий для Вас вариант.

Смотрите наш канал Youtube на https://www.youtube.com/freehostua.

Ми в чем то ошиблись или что то пропустили?

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

Дата: 04.04.2023
Автор: Александр Ровник
Голосование

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

comments powered by Disqus
navigate
go
exit
Спасибо, что выбираете FREEhost.UA