Переменная shell в linux

Переменные и параметры

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

Подстановка переменных

Важно понимать разницу между именем переменной и значением этой переменной, и не забывать о ней. Например: 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

Источник

Читайте также:  Настроить dns сервер linux centos
Оцените статью
Adblock
detector