- Переменные и параметры
- Подстановка переменных
- Примеры назначения и подстановки переменных
- Присваивание значений переменным
- Простое присваивание
- Простое и замаскированное присваивание
- Переменные Bash не имеют определенного типа
- Целое число или строка
- Специальные типы переменных
- локальные переменные
- переменные окружения
- Позиционные параметры
- Переменные в Bash скриптах
- Переменные среды Bash
- Пользовательские переменные Bash
- Выводы
Переменные и параметры
Переменная — это один из основных элементов любого языка программирования. Переменные участвуют практически в любых операциях, будь то арифметические действия или анализ строк. По сути, любая переменная, это ячейка памяти, содержащая в себе определенные данные.
Подстановка переменных
Важно понимать разницу между именем переменной и значением этой переменной, и не забывать о ней. Например: variable — это символическое имя переменной
в то время как $variable — это уже ссылка на значение переменной ( на область памяти, содержащую значение переменной с именем variable ). Имена переменных, без префикса $, могут использоваться в процессе объявления переменной, то есть когда переменной присваивается определенное значение, при удалении значения переменной, при экспорте и в случаях — когда переменная является названием сигнала.
Присвоить значение переменной можно с помощью оператора =:
различными вариантами с использованием оператора read:
Если ссылка на переменную, заключена в двойные кавычки, это никак не повлияет на работу подстановки переменной, то есть:
freebsd /# ./test.sh hello world
если-же строка с переменной заключается в одинарные кавычки, в них экранируются любые служебные символы, то строка будет выведена в том виде, в котором она записана в тесте сценария, без подстановки значения переменной:
freebsd /# ./test.sh $var world
Форма записи $var, является упрощенным вариантом $ . Запись с фигурными скобками $ , является более строгим вариантом, ее можно применять там, где обычный вариант вызывает синтаксическую ошибку.
Примеры назначения и подстановки переменных
# Использование пробелов, перед, или после, знака =, не допустимо
# При записи VAR =value, интерпретатор попытается выполнить команду VAR с параметром =value.
# Если попробовать присвоить значение переменной таким образом VAR= value, будет произведена попытка назначить переменной окружения VAR пустое
# значение, после чего, выполнить команду value.
echo hello # Здесь просто будет выведена строка "hello"
echo $ # Идентично предыдущей строке.
Обратите внимание на разницу выводимых результатов в примере ниже. Если переменная заключена в двойные кавычки, пробельные символы будут сохранены а при заключении переменной в одинарные кавычки, значение переменной не подставляется, символ $ интерпретируется как обычный символ.
freebsd /# ./test.sh A B C D A B C D $hello
Объявление неинициализированной переменной, фактически то-же самое что и сброс переменной
# Неинициализированная переменная
# Присвоение значения переменной
# Сброс значения переменной
freebsd /# ./test.sh var = var = 100 var =
Неинициализированная переменная содержит пустое значение, в арифметических операциях пустое значение интерпретируется как 0. Использование пустых переменных потенциально может вызывать различного рода ошибки в процессе работы сценария, однако в арифметических операциях их использование вполне допустимо.
echo "$uninitialized" # пустое значение
let "uninitialized += 5" # к пустому значению прибавить 5
echo "$uninitialized" # результат 5
Допускается присвоение значений нескольким переменным в одной строке.
var1=variable1 var2=variable2 var3=variable3
echo "var1=$var1 var2=$var2 var3=$var3"
Со старыми версиями «sh» могут возникнуть проблемы .
Присваивание значений переменным
Операцией присвоения значения переменной в bash является символ равно, «=», в зависимости от контекста использования так-же является оператором сравнения «равно».
Простое присваивание
echo "Значение переменной \"a\" = $a"
# Присваивание значения с помощью ключевого слова 'let'
echo "Значение переменной \"a\" = $a."
# Неявное присваивание в заголовке цикла 'for'
echo -n "Значения переменной \"a\" в цикле: "
# Одна из разновидностей присваивания с использованием инструкции 'read'
echo -n "Введите значение переменной \"a\" "
echo "Значение переменной \"a\" теперь стало равным: $a."
Простое и замаскированное присваивание
# Подстановка команд, немного более сложный вариант.
a=`echo Hello!` # Переменной 'a' присваивается результат выполнения команды 'echo'
Обратите внимание на восклицательный знак (!) в подстанавливаемой команде, из командной строки такой вариант работать не будет, поскольку здесь используется механизм истории команд bash. Но в сценариях использование истории команд запрещено
a=`ls -l` # Переменной 'a' присваивается результат выполнения команды 'ls -l'
echo $a # Если не используются кавычки, будут удалены лишние пробелы и пустые строки
echo "$a" # При использовании кавычек, все пробелы и пустые строки будут сохранены
Присваивание значений переменным подстановкой команд с использованием конструкции $(. ), более современный метод, нежели подстановка команд с помощью обратных кавычек.
Переменные Bash не имеют определенного типа
В отличие от большинства других языков программирования, Bash не разделяет переменные по типам. По сути, переменные Bash являются строковыми переменными, но, в зависимости от контекста, Bash допускает целочисленную арифметику с переменными. Определяющим фактором здесь служит содержимое переменных.
Целое число или строка
# Переменной присваивается целое число
# Переменная все еще является целым числом 2335
# Происходит трансформация числа в строку.
declare -i b # Явное указание типа ничего не изменит
# Переменная $d становится целочисленной.
# Как ведут себя "пустые" переменные
let "e += 1" # В арифметических операциях возможно использование "пустых" переменных
# "Пустая" переменная становится целочисленной.
# Поведение неинициализированных переменных
let "f += 1" # Арифметические операции разрешены
echo # Неинициализированная переменная трансформируется в целочисленную.
Переменные не имеющие типов, палка о двух концах, с одной стороны они делают сценарии более гибкими и упрощают чтение кода, с другой могут приводить к неожиданным ошибкам и развивают в человеке «неряшливость» в программировании, кроме того вся ответственность за отслеживание типов переменных полностью ложится на программиста.
Специальные типы переменных
локальные переменные
Локальными переменными являются переменные область видимости которых ограничена вложенным блоком кода или функцией, однако переменные объявленные во вложенном блоке, доступны и за его пределами, в отличии от переменных, объявленных в теле функции.
переменные окружения
Переменные окружения затрагивают командную оболочку в целом и влияют на порядок взаимодействия с пользователем.
В общем контексте, каждый процесс имеет свое среду исполнения ( окружение ), т.е. некоторый набор переменных, которые процесс может использовать во время своей работы. Системная оболочка так-же представляет из себя процесс, со всеми вытекающими последствиями.
При запуске командного интерпретатора, для него создаются переменные, соответствующие переменным окружения. Любое изменение переменных окружения заставляет оболочку обновить свои переменные, и все дочерние процессы ( команды, запускаемые из системной оболочки) наследуют это окружение.
Пространство, выделяемое переменным окружения, ограничено. Создание слишком большого количества переменных окружения или одной переменной, которая занимает слишком большое пространство, может привести к возникновению определенных проблем.
freebsd /# eval "`seq 10000 | sed -e 's/.*/export var&=ZZZZZZZZZZZZZZ/'`" freebsd /# bash$ du freebsd /# /usr/bin/du: Argument list too long
Если сценарий меняет переменные окружения, они должны быть экспортированы, т.е передаться окружению, локальному по отношению к сценарию. Делается это с помощью команды export.
Любой сценарий может экспортировать переменные только дочернему, по отношению к себе, процессу, т.е. командам и процессам запускаемым из данного сценария. Дочерний процесс не может экспортировать переменные родительскому процессу.
Позиционные параметры
Позиционные параметры, это аргументы, получаемые сценарием при запуске из командной строки — $0, $1, $2, $3. где $0 — это название файла сценария, $1 — первый аргумент, $2 — второй, $3 — третий и так далее. Аргументы, следующие за $9, должны быть заключены в фигурные скобки, например: $ , $ , $ .
Специальные переменные $* и $@ содержат все поступившие в сценарий позиционные параметры.
# Данный сценарий должен вызываться как минимум с 10 аргументами
# ./scriptname 1 2 3 4 5 6 7 8 9 10
Переменные в Bash скриптах
Существование сценариев, состоящих из отдельных команд, считается нормальным явлением. Но иногда возникают ситуации, когда этого становится недостаточно. Например, часто необходимо использовать данные от команды к команде, чтобы обработать информацию. С этой задачей помогают справиться переменные в скриптах.
В этой статье будут рассмотрены переменные в Bash скриптах с точки зрения области видимости, а также некоторые особенности при работе с ними.
Переменные среды Bash
Командный интерпретатор Bash поддерживает переменные среды, которые отслеживают различную системную информацию:
- Имя системы;
- Имя пользователя, зарегистрированного в системе;
- Идентификатор пользователя (UID);
- Исходный (домашний) каталог пользователя по умолчанию и т.п.
Для ознакомления с полным списком локальных переменных среды используется команда set.
Значения этих переменных Bash можно использовать в сценариях, для чего необходимо указать имя переменной с предшествующим ей знаком доллара ($).
#!/bin/bash
echo «Информация о пользователе $USER:»
echo UID: $UID
echo Домашний каталог: $HOME
Переменные окружения Bash $USER, $UID и $HOME использовались для отображения запрашиваемой информации о текущем зарегистрированном пользователе.
Обратите внимание: переменные среды в командах echo заменяются их текущими значениями при выполнении программы. Кроме того, переменные, заключённые в кавычках, и вне их интерпретируются правильно.
Однако в таком методе есть некоторый недостаток: при попытке отобразить какое-то денежное значение в долларовом эквиваленте необходимо добавить перед знаком доллара обратный слэш для его экранирования, чтобы интерпретатор не посчитал следующую за ним цифру именем переменной, принимающей параметр скрипта по указанному номеру.
#!/bin/bash
echo «Неправильная цена вещи: $15»
echo «Правильная цена вещи: \$15»
В первой строке, где отображается неправильная цена, интерпретатор воспринял $ как знак начала переменной 1, которая считала первый параметр запущенной программы. Поскольку параметр ничего не содержал, то ничего и не было отображено вместо $1.
На заметку: частым случаем является использование фигурных скобок вокруг имени переменной после знака доллара (например $ ). Этот приём позволяет просто определить имя переменной, а на её функциональность это никак не влияет.
Пользовательские переменные Bash
В сценариях командного интерпретатора Bash можно не только использовать переменные среды, но также создавать и включать собственные. Задание переменных позволяет сохранять данные и использовать их во время работы скрипта, что делает его более интерактивным.
Пользовательские переменные Bash Linux могут быть названы любой текстовой строкой длиной до 20 символов, состоящей из букв, цифр и символа подчёркивания. В названии учитывается регистр букв, поэтому переменная Var1 не является переменной var1. Новички в области написания сценариев часто забывают об этой особенности, отчего и допускают трудно диагностируемые ошибки.
Присвоение значения переменной Bash выполняется с помощью знака равенства (=). Слева и справа от знака не должно быть разделяющих символов по типу пробела. Это правило также часто забывается неофитами. Вот пример присваивания значений переменным:
var1=50
var2=-120
var3=test
var4=»текстовая строка»
Ключевой особенностью интерпретатора Bash является автоматическое определение типа данных, используемого для представления значения переменных. После их определения сценарий сохраняет значения этих переменных на протяжении всего времени работы программы и уничтожает после её завершения.
На заметку: обращение к пользовательским переменным осуществляется так же, как и к системным, — с помощью знака доллара ($). Он не используется, когда переменной присваивается значение.
Выводы
Для обработки информации в сценариях командного интерпретатора используются переменные среды Bash и пользовательские переменные. Последние имеют жизнеспособность по умолчанию до тех пор, пока работает программа. При обращении к пользовательским переменным применяется знак доллара, а при записывании в них данных — нет.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.