Поиск по сайту:

Переменные Bash | Типы переменных Bash

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

Bash обрабатывает два типа переменных. Они есть:

  • Пользовательские переменные: переменные, которые вы создаете и манипулируете ими.
  • Переменные среды: создаются и сохраняются bash или приложениями для целей системы/приложения.

Мы начнем работать с пользовательскими переменными, а затем с переменными среды.

1. Как создать переменную

Переменная должна иметь идентификатор (имя переменной) и присвоенное ей значение, как показано ниже. Идентификатор (имя переменной) — "site_name", а назначенное значение — "OSTechnix".

site_name="OSTechnix"
this_year=2021
value_of_pi=3.14

При создании переменных следует помнить несколько вещей.

  • Между именем и значением переменной не должно быть пробела.
  • Старайтесь избегать использования уже используемых имен, таких как зарезервированные ключевые слова bash, имена переменных и функций, которые могут создать конфликт.
  • Создавайте описательные имена переменных. Имена переменных могут содержать буквы, цифры, символы подчеркивания и цифры.

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

2. Как получить доступ к переменным Bash

Есть два способа доступа к переменной. В одном методе используется "символ $", за которым следует имя переменной, а во втором методе используется "символ $", за которым следуют фигурные скобки и имя переменной внутри фигурных скобок.

echo $site_name
OSTechnix
echo ${this_year}
2021
echo ${this_year} $value_of_pi
2021 3.14

Доступ к переменным Bash

3. Переназначить значение переменной.

В Bash нет строгой системы типов, что означает отсутствие строгих правил определения типа данных при создании переменных. Переменная Bash хранит все значения в виде строк и прекрасно понимает, когда мы работаем с числовыми вычислениями.

Вы можете переназначить любые значения уже созданной переменной.

os_name="PoP_OS!"
echo ${os_name}
PoP_OS!
os_name="Linux Mint"
echo ${os_name}
Linux Mint

Переприсвоить значение переменной

4. Объявление типа данных для переменной

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

declare --help

Доступ к справке по команде объявления

Например, если вы хотите создать переменную с типом данных int, вы можете использовать команду declare с -i флаг.

declare -i pi
pi=3
echo $pi
3
pi=3.14
bash: 3.14: syntax error: invalid arithmetic operator (error token is ".14")

Объявление типа данных для переменных

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

5. Вывод команды в переменную

Вы можете запускать любые команды bash и сохранять вывод команды в переменную. Вам необходимо запустить команду внутри $(), как показано ниже, а затем использовать переменную для дальнейшей обработки.

today_date=$(date)
echo ${today_date}
Saturday 11 September 2021 08:53:25 PM IST

Сохранение вывода в переменную

6. Использование кавычек с переменной

В bash одинарные и двойные кавычки ведут себя по-разному. Одинарные кавычки предотвратят расширение и будут считать значение буквальным. Двойные кавычки позволят расширить.

Взгляните на приведенный ниже пример. Я создал переменную с именем "what_year" и запустил команду вместе со строкой. Когда я использую двойные кавычки, команда date будет расширена, но когда используются одинарные кавычки, команда date не запускается и сохраняется в переменной.

which_year="I am in year : $(date +%Y)"
echo ${which_year}
I am in year : 2021
which_year='I am in year : $(date +%Y)'
echo ${which_year}
I am in year : $(date +%Y)'

Поведение одинарных и двойных кавычек в переменных

7. Удаление переменной

Вы можете удалить переменную с помощью команды unset.

Команда Unset удаляет значения и атрибуты переменных и функций.

Вы можете использовать либо unset с флагом -v, который указывает на переменную, либо просто команду unset, которая по умолчанию сначала проверяет определение переменной и сбрасывает ее. .

echo ${which_year}
unset -v which_year (or) unset which_year
echo ${which_year}

Сбросить переменную

Более подробную информацию можно найти в разделе справки по команде unset.

unset --help

8. Переменная только для чтения

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

Используйте встроенный в bash readonly, чтобы создать переменную, доступную только для чтения.

readonly var1="This is a readonly variable"

Альтернативно вы можете использовать команду declare с флагом -r.

declare -r var2="This is a readonly variable too"

Вы не можете переназначить или отменить значение переменной readonly, это приведет к ошибке.

var2="Reassigning with new value"
bash: var2: readonly variable
unset var1
bash: unset: var1: cannot unset: readonly variable

Переменная только для чтения

9. Встроенные специальные переменные Bash

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

$? = Stores exit status of last ran the command.
$$ = Stores process ID for your bash session.
$0 = Script name.
$1 .. $9 = Arguments passed to the script.
$# = Count the length of values
$@, $* = Stores array of all values.

9.1. Статус выхода ($?)

Каждая команда Linux, которую вы запускаете, имеет соответствующий код завершения (0–255). Ноль указывает на успех, а остальное указывает на неудачу с другим значением.

whoami
echo $?
0
asdf # WRONG COMMAND
echo $?
127

Код состояния выхода

9.2. Идентификатор процесса ($$)

Используя оператор $$, вы можете получить идентификатор процесса bash. Если вы запустите его с терминала, он предоставит вам идентификатор процесса для вашего текущего сеанса.

echo $$
195777 # PROCESS ID OF MY CURRENT TERMINAL SESSION

Идентификатор процесса Bash

9.3. Имя сценария и аргументы ($0–$9)

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

id karthick
uid=1000(karthick) gid=1000(karthick) groups=1000(karthick),4(adm),27(sudo),119(lpadmin),998(docker)

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

cat > main.sh
#!/bin/bash

echo "+ script_name=$0 "
echo "+ first_argument=$1 "
echo "+ second_argument=$2 "
echo "+ third_argument=$3 "

Теперь запустите скрипт и передайте аргументы. Я передаю от 1 до 3 в качестве аргументов. $0 выбирает имя сценария с абсолютным путем, поскольку я передал абсолютный путь, а от $1 до $3 присваиваются соответствующие переданные аргументы.

/home/karthick/main.sh 1 2 3
+ script_name=/home/karthick/main.sh 
+ first_argument=1 
+ second_argument=2 
+ third_argument=3 

Аргументы, передаваемые в скрипт

9.4. Длина значения ($#)

Используя $#, вы можете подсчитать общее количество переданных аргументов или длину любых значений. Взгляните на приведенный ниже пример. Добавьте к имени переменной префикс #, и она будет печатать длину значения вместо фактического значения.

site_name="OSTechnix"
echo ${#site_name}
9

Длина строки

10. Переменная область действия

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

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

  1. Создайте переменную site_name="OSTechnix" из текущей оболочки и получите доступ к этой переменной.
  2. Используйте переменную $$, чтобы узнать, в каком сеансе вы находитесь.
  3. Создайте новый сеанс bash, набрав "bash".
  4. Попробуйте получить доступ к переменной site_name из этого сеанса. Вы получите пустой вывод, который является поведением по умолчанию в bash.
  5. Выйдите из нового сеанса, набрав "Выход", и теперь попробуйте получить доступ к переменной, и вы сможете получить к ней доступ.

Область действия переменной

Если вы хотите получить глобальный доступ к переменной из любых сеансов, вам необходимо использовать команду export, которая сделает переменную доступной для доступа во всех дочерних сеансах/процессах, созданных из вашего текущего сеанса.

site_name="OSTechnix"
export site_name

Или

export site_name="OSTechnix"
bash
echo ${site_name}

Экспортированная переменная

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

export

Список экспортированных переменных

11. Переменная среды

До сих пор мы видели, как работать с пользовательскими переменными. Во введении я упомянул, что bash поддерживает переменные среды. Этот набор переменных будет загружен при запуске сеансов bash и будет поддерживаться bash. Эти переменные среды используются приложениями для определения поведения.

Например, nano установлен в качестве редактора по умолчанию для редактирования crontab. Если я хочу использовать Vim вместо nano, я могу установить переменную EDITOR env, и crontab проверит эту переменную среды и будет использовать ее.

export EDITOR="vim"
crontab -e

Внимание! Ваша переменная привязана только к вашему текущему сеансу. Если вы хотите сделать его постоянным, вам нужно поместить его в ~/.bashrc или ~/.bash_profile.

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

printenv

Среда печати

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

printenv USER # PRINTS USER NAME
karthick
printenv HOME # USER HOME DIRECTORY LOCATION
/home/karthick
printenv PWD # PRESSENT WORKING DIRECTORY
/home/karthick
printenv SHELL # WHICH SHELL I AM USING NOW
/bin/bash
printenv PATH # PATH WHICH IS USED BY BASH TO CHECK AND RUN COMMANDS
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Распечатайте важные переменные среды

Заключение

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

Связанное чтение:

  • Скрипты Bash: цикл For с примерами
  • Скрипты Bash: циклы while и Until с примерами
  • Скрипты Bash: функции, поясняемые примерами
  • Команда Bash Echo с примерами для Linux
  • Руководство по Bash Heredoc для начинающих
  • Перенаправление Bash, объясненное примерами
  • Разница между определением переменных Bash с экспортом и без него

Статьи по данной тематике