Объявление переменных в Linux

LinuxBeginner
Практиковаться сейчас

Введение

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

Понимание того, как объявлять и использовать переменные, является фундаментальным навыком для написания сценариев Linux shell. Эти знания помогут вам автоматизировать задачи, управлять настройками и создавать более динамичные сценарии для различных приложений.

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

Базовое объявление переменных

На этом этапе вы узнаете, как объявлять и использовать базовую переменную в сценарии bash. Переменные в сценариях Linux shell позволяют вам временно хранить данные и ссылаться на них позже в вашем сценарии.

Сначала создадим каталог для нашего проекта и перейдем в него:

mkdir -p ~/project
cd ~/project

Теперь создадим сценарий с именем variables.sh с помощью текстового редактора nano:

nano ~/project/variables.sh

Внутри редактора введите следующее содержимое:

#!/bin/bash

## Declaring a basic variable
BALLOON_COLOR="red"

## Displaying the variable value
echo "The balloon color is: $BALLOON_COLOR"

В этом сценарии мы объявили переменную с именем BALLOON_COLOR и присвоили ей значение "red". Затем команда echo выводит значение этой переменной.

Чтобы сохранить файл в nano, нажмите Ctrl+O, затем нажмите Enter для подтверждения. Чтобы выйти из nano, нажмите Ctrl+X.

Теперь сделаем сценарий исполняемым:

chmod +x ~/project/variables.sh

Эта команда дает файлу разрешение на выполнение, позволяя вам запускать его как программу.

Наконец, выполните ваш сценарий:

./variables.sh

Вы должны увидеть следующий вывод:

The balloon color is: red

Это показывает, что ваша переменная была успешно объявлена, и ее значение можно получить с помощью символа $ перед именем переменной.

Объявление целочисленных переменных

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

Откройте снова сценарий variables.sh для редактирования:

nano ~/project/variables.sh

Измените сценарий, добавив целочисленную переменную:

#!/bin/bash

## Declaring a basic string variable
BALLOON_COLOR="red"

## Declaring an integer variable
declare -i BALLOON_SIZE=10

## Displaying both variables
echo "The balloon color is: $BALLOON_COLOR"
echo "The balloon size is: $BALLOON_SIZE inches"

## Performing arithmetic with the integer variable
declare -i DOUBLE_SIZE=BALLOON_SIZE*2
echo "Double the size would be: $DOUBLE_SIZE inches"

В этом обновленном сценарии:

  1. Мы сохранили нашу исходную строковую переменную BALLOON_COLOR.
  2. Мы добавили новую целочисленную переменную BALLOON_SIZE с использованием синтаксиса declare -i.
  3. Мы показали, как выполнять арифметические операции с целочисленными переменными.

Сохраните файл с помощью Ctrl+O и Enter, затем выйдите из nano с помощью Ctrl+X.

Теперь запустите сценарий снова:

./variables.sh

Вы должны увидеть следующий вывод:

The balloon color is: red
The balloon size is: 10 inches
Double the size would be: 20 inches

Объявление с -i позволяет bash распознавать, что переменную следует рассматривать как целое число, что делает возможными арифметические операции. Это особенно полезно для счетчиков, вычислений и числовой обработки в ваших сценариях.

Работа с массивами переменных

На этом этапе вы узнаете, как объявлять и использовать массивы переменных. Массивы позволяют хранить несколько значений под одним именем переменной, что полезно при работе с наборами связанных данных.

Давайте снова отредактируем наш сценарий:

nano ~/project/variables.sh

Обновите сценарий, добавив массив переменных:

#!/bin/bash

## Declaring a basic string variable
BALLOON_COLOR="red"

## Declaring an integer variable
declare -i BALLOON_SIZE=10

## Declaring an array variable
declare -a BALLOON_COLORS=("red" "green" "blue" "purple" "yellow")

## Displaying individual variables
echo "The balloon color is: $BALLOON_COLOR"
echo "The balloon size is: $BALLOON_SIZE inches"

## Displaying all array elements
echo "Available balloon colors are: ${BALLOON_COLORS[*]}"

## Displaying specific array elements
echo "The first color is: ${BALLOON_COLORS[0]}"
echo "The third color is: ${BALLOON_COLORS[2]}"

## Count of array elements
echo "Number of available colors: ${#BALLOON_COLORS[@]}"

В этом обновленном сценарии:

  1. Мы сохранили существующие переменные.
  2. Мы добавили массив переменных BALLOON_COLORS с использованием синтаксиса declare -a.
  3. Мы показали различные способы доступа к элементам массива:
    • ${BALLOON_COLORS[*]} выводит все элементы.
    • ${BALLOON_COLORS[0]} обращается к первому элементу (в bash массивы индексируются с нуля).
    • ${#BALLOON_COLORS[@]} возвращает количество элементов в массиве.

Сохраните файл с помощью Ctrl+O и Enter, затем выйдите из nano с помощью Ctrl+X.

Теперь запустите сценарий снова:

./variables.sh

Вы должны увидеть следующий вывод:

The balloon color is: red
The balloon size is: 10 inches
Available balloon colors are: red green blue purple yellow
The first color is: red
The third color is: blue
Number of available colors: 5

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

Манипуляция и расширение переменных

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

Давайте снова отредактируем наш сценарий:

nano ~/project/variables.sh

Обновите сценарий, чтобы продемонстрировать манипуляцию переменными:

#!/bin/bash

## Declaring basic variables
NAME="linux"
MESSAGE="Hello, world!"
FILE_PATH="/home/user/documents/report.txt"

echo "Original values:"
echo "NAME = $NAME"
echo "MESSAGE = $MESSAGE"
echo "FILE_PATH = $FILE_PATH"

echo -e "\nVariable manipulation examples:"

## Convert to uppercase
echo "NAME in uppercase: ${NAME^^}"

## Convert to lowercase
UPPER_NAME="LINUX"
echo "UPPER_NAME in lowercase: ${UPPER_NAME,,}"

## Get string length
echo "Length of MESSAGE: ${#MESSAGE}"

## Extract substring (starting at position 7, 5 characters)
echo "Substring of MESSAGE: ${MESSAGE:7:5}"

## Replace part of string
echo "Replace 'world' with 'Linux': ${MESSAGE/world/Linux}"

## Extract filename from path
echo "Filename from path: ${FILE_PATH##*/}"

## Extract directory from path
echo "Directory from path: ${FILE_PATH%/*}"

## Default value if variable is unset
UNSET_VAR=""
echo "Default value example: ${UNSET_VAR:-default value}"

Этот сценарий демонстрирует несколько методов манипуляции переменными:

  1. ${NAME^^} - Преобразование в верхний регистр
  2. ${UPPER_NAME,,} - Преобразование в нижний регистр
  3. ${#MESSAGE} - Получение длины строки
  4. ${MESSAGE:7:5} - Извлечение подстроки (позиция и длина)
  5. ${MESSAGE/world/Linux} - Замена части строки
  6. ${FILE_PATH##*/} - Удаление самого длинного совпадения с начала (извлечение имени файла)
  7. ${FILE_PATH%/*} - Удаление самого короткого совпадения с конца (извлечение директории)
  8. ${UNSET_VAR:-default value} - Использование значения по умолчанию, если переменная не установлена

Сохраните файл с помощью Ctrl+O и Enter, затем выйдите из nano с помощью Ctrl+X.

Теперь запустите сценарий:

./variables.sh

Вы должны увидеть вывод, похожий на следующий:

Original values:
NAME = linux
MESSAGE = Hello, world!
FILE_PATH = /home/user/documents/report.txt

Variable manipulation examples:
NAME in uppercase: LINUX
UPPER_NAME in lowercase: linux
Length of MESSAGE: 13
Substring of MESSAGE: world
Replace 'world' with 'Linux': Hello, Linux!
Filename from path: report.txt
Directory from path: /home/user/documents
Default value example: default value

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

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

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

Создайте новый сценарий с именем environment.sh:

nano ~/project/environment.sh

Добавьте следующее содержимое:

#!/bin/bash

## Displaying some common environment variables
echo "USER: $USER"
echo "HOME: $HOME"
echo "PATH: $PATH"
echo "PWD: $PWD"
echo "SHELL: $SHELL"

## Creating a local variable
LOCAL_VAR="This is a local variable"
echo "LOCAL_VAR: $LOCAL_VAR"

## Exporting a variable to make it available to child processes
export EXPORTED_VAR="This variable is exported"
echo "EXPORTED_VAR: $EXPORTED_VAR"

## Demonstrate how variables work in subshells
echo -e "\nVariable behavior in subshell:"
(
  echo "Inside subshell:"
  echo "  LOCAL_VAR: $LOCAL_VAR"
  echo "  EXPORTED_VAR: $EXPORTED_VAR"
  echo "  Creating subshell-only variable"
  SUBSHELL_VAR="This variable only exists in the subshell"
  echo "  SUBSHELL_VAR: $SUBSHELL_VAR"
)

echo -e "\nAfter subshell:"
echo "LOCAL_VAR: $LOCAL_VAR"
echo "EXPORTED_VAR: $EXPORTED_VAR"
echo "SUBSHELL_VAR: $SUBSHELL_VAR" ## This will be empty

## Creating a script to test export behavior
echo -e "\nCreating child script to test variable export..."
cat > ~/project/child_script.sh << 'EOF'
#!/bin/bash
echo "In child script:"
echo "EXPORTED_VAR: $EXPORTED_VAR"
echo "LOCAL_VAR: $LOCAL_VAR"
EOF

chmod +x ~/project/child_script.sh

## Run the child script
echo -e "\nRunning child script:"
./child_script.sh

Этот сценарий демонстрирует:

  1. Общие переменные окружения (USER, HOME, PATH и т.д.).
  2. Разницу между локальными и экспортированными переменными.
  3. Поведение переменных в подоболочках (скобки создают подоболочку).
  4. Как экспортированные переменные наследуются дочерними процессами.

Сохраните файл с помощью Ctrl+O и Enter, затем выйдите из nano с помощью Ctrl+X.

Сделайте сценарий исполняемым:

chmod +x ~/project/environment.sh

Теперь запустите сценарий:

./environment.sh

Вывод показывает, как переменные ведут себя в разных контекстах:

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

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

Резюме

В этом практическом занятии вы изучили основы объявления и манипуляции переменными в скриптах Linux-оболочки. Вы рассмотрели:

  • Базовое объявление и использование переменных
  • Целочисленные переменные и арифметические операции
  • Массивные переменные для хранения наборов данных
  • Техники манипуляции переменными для обработки текста
  • Переменные окружения и область видимости переменных

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

Теперь вы можете использовать эти техники для:

  • Хранения настроек конфигурации в своих скриптах
  • Обработки пользовательского ввода и содержимого файлов
  • Манипуляции текстовыми данными и путями к файлам
  • Обмена данными между различными скриптами и процессами

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