Определение переменных в Bash
Переменные в Bash позволяют хранить в себе определенные числовые или текстовые значения.
Для объявления переменной достаточно написать ее имя и значение, которое она в себе будет хранить. При обращении к переменной, нужно предварять ее знаком доллара - $
:
1 2 3 |
#!/bin/bash my_var="Hello there!" echo $my_var |
Не ставьте пробелы до и после знака равенства - =
, т.к. в этом случае оболочка может ошибочно принять имя переменной за имя команды.
Правильно: my_var=45
Неправильно: my_var = 45
Системные переменные
Изначально в Bash доступен набор переменных, которые были определены разработчиками оболочки. Эти переменные предназначены для хранения настроек оболочки. Переопределяя значения системных переменных, вы сможете изменить конфигурацию командной оболочки.
В именах системных переменных принято использовать только заглавные буквы, а слова отделяются символом подчеркивания, например PS1
, PATH
, BASH_VERSION
и др.
Узнать список системных переменных можно с помощью следующих команд.
set
или
env
или
printenv
Использование переменных
Переменные часто используются в вывод строк. Чтобы указать переменную в строке укажите ее внутри двойных кавычек.
1 2 3 |
#!/bin/bash my_name="Oleg" echo "My name is $my_name" |
meliorem@ubuntu:~$ show_name.sh
My name is Oleg
Если использовать одинарные кавычки, то ссылка на переменную будет отображена как обычный текст.
1 2 3 |
#!/bin/bash my_name="Oleg" echo 'My name is $my_name' |
meliorem@ubuntu:~$ show_name.sh
My name is $my_name
В переменных можно сохранять результат выполнения какой либо команды, для этого поместите команду в обратные ковычки или в круглые скобки со знаком $
вначале.
1 2 3 4 5 |
#!/bin/bash folders_amount=`ls -l | grep ^d | wc -l` echo "Folders: ${folders_amount}" local_ip=$(hostname -i | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}") echo "IP address: ${local_ip}" |
meliorem@ubuntu:~$ cmd_output.sh
Folders: 10
IP address: 192.168.0.190
Также переменным можно присвоить значение содержимого какого-либо файла:
1 2 3 |
#!/bin/bash file_content=$(<somefile) echo $file_content |
Иногда случаются ситуации когда текст нужно подставить вплотную к значению переменной.
Например, в данной ситуации мы хотим слить воедино значение переменной $prefix
и следующее за ней слово - "rock".
1 2 3 |
#!/bin/bash prefix="Hard" echo "$prefixrock cafe." |
В результате мы получим только часть вывода т.к. интерпретатор будет пытаться найти переменную $prefixrock, которой у нас нет.
meliorem@ubuntu:~$ var_merge.sh
cafe.
Чтобы получить желаемое слияние текста и значения переменной воспользуемся следующим синтаксисом. Установим имя переменной внутри фигурных скобок - {}
с предваряющим знаком - $
1 2 3 |
#!/bin/bash prefix="Hard" echo "${prefix}rock cafe." |
meliorem@ubuntu:~$ var_merge.sh
Hardrock cafe.
Именование переменных
Предполагается, что имена переменных, написанные заглавными буквами, относятся к переменным среды. Чаще всего для именования локальных переменных используют строчные буквы и символ подчеркивания.
Имена переменных чувствительны к регистру символов, т.е. переменные $My_Var и $my_var - это разные переменные.
Имена переменных не могут начинаться с цифры и содержать какие-либо знаки, кроме знака подчеркивания - _
.
Переменные со значением по умолчанию
Не объявленные переменные могут принимать значения по умолчанию.
Если переменная не объявлена, то с помощью оператора - :=
мы можем задать ей начальное значение.
Рассмотрим пример установки значения по умолчанию.
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash # Объявляем переменную $planet и присваиваем ей значение planet="Earth" # Сбрасываем значение переменной $planet unset planet echo "\$planet:= ${planet:=Mars}" echo "\$planet:= ${planet:=Venus}" echo "\$planet: ${planet}" planet="Jupiter" echo "\$planet: ${planet}" |
Значение по умолчанию можно задать только один раз.
meliorem@ubuntu:~$ var_default.sh
$planet:= Mars
$planet:= Mars
$planet: Mars
$planet: Jupiter
Область видимости переменных
По умолчанию все переменные являются глобальными, даже те, что объявлены внутри функций.
Если вы хотите чтобы переменная стала локальной, добавьте ключевое слово - local
перед ее именем.
1 2 3 4 5 6 7 8 9 |
#!/bin/bash name=Jane function show_name { local name=John echo $name } echo $name show_name echo $name |
meliorem@ubuntu:~$ show_name.sh
Jane
John
Jane
Константы
В Bash помимо переменных есть также и константы, разница лишь в том, что их значения нельзя изменять.
Для объявления константы используйте ключевое слово readonly
.
Константу нельзя удалить с помощью unset
.
1 2 3 4 5 |
#!/bin/bash readonly script_path="/usr/local/bin/somescript.sh" echo $script_path # Спровоцируем ошибку script_path="/new/path/anotherscript.sh" |
meliorem@ubuntu:~$ constant.sh
/usr/local/bin/somescript.sh
constant.sh: line 4: script_path: readonly variable