Как присваивать и переприсваивать переменные в Bash

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

Введение

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

Создание и присваивание переменных Bash

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

Откройте новый терминал в среде LabEx. Вы должны находиться в каталоге /home/labex/project.

Чтобы присвоить значение переменной в Bash, используйте следующий синтаксис:

variable_name=value

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

Давайте создадим нашу первую переменную:

  1. В терминале введите следующую команду и нажмите Enter:
name="John"
  1. Чтобы отобразить значение переменной, используйте команду echo с именем переменной, перед которым стоит знак доллара ($):
echo $name

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

John
  1. Вы также можете использовать двойные кавычки вокруг имени переменной:
echo "My name is $name"

Вывод:

My name is John
  1. Чтобы переназначить новое значение той же переменной, просто снова используйте оператор присваивания (=):
name="Alice"
echo "My name is $name"

Вывод:

My name is Alice

Правила именования переменных

При создании переменных в Bash следуйте этим соглашениям об именовании:

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

Давайте создадим файл для практики с переменными. В WebIDE создайте новый файл с именем variables.sh в каталоге проекта:

  1. Нажмите на значок "New File" (Новый файл) в IDE
  2. Назовите файл variables.sh
  3. Добавьте следующий код в файл:
#!/bin/bash

## Assigning variables
first_name="John"
last_name="Doe"
age=25

## Displaying variables
echo "First name: $first_name"
echo "Last name: $last_name"
echo "Age: $age"

## Reassigning variables
first_name="Jane"
echo "Updated first name: $first_name"
  1. Сохраните файл, нажав Ctrl+S или выбрав File → Save (Файл → Сохранить)

  2. Сделайте скрипт исполняемым, выполнив следующую команду в терминале:

chmod +x variables.sh
  1. Запустите скрипт с помощью:
./variables.sh

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

First name: John
Last name: Doe
Age: 25
Updated first name: Jane

Это демонстрирует, как создавать переменные, присваивать им значения и переназначать новые значения.

Работа со значениями переменных и строковыми операциями

На этом шаге мы рассмотрим различные способы работы со значениями переменных в Bash, включая строковые операции и арифметические вычисления.

Строковые операции

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

  1. Создайте новый файл с именем string_operations.sh в каталоге проекта:
#!/bin/bash

## String concatenation
greeting="Hello"
name="World"
message="$greeting $name"
echo $message

## String length
text="Welcome to Bash scripting"
length=${#text}
echo "The length of '$text' is $length characters"

## Extracting substrings
substring=${text:0:7}
echo "Substring: $substring"

## Converting to uppercase and lowercase
uppercase=${text^^}
lowercase=${text,,}
echo "Uppercase: $uppercase"
echo "Lowercase: $lowercase"
  1. Сохраните файл и сделайте его исполняемым:
chmod +x string_operations.sh
  1. Запустите скрипт:
./string_operations.sh

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

Hello World
The length of 'Welcome to Bash scripting' is 25 characters
Substring: Welcome
Uppercase: WELCOME TO BASH SCRIPTING
Lowercase: welcome to bash scripting

Арифметические операции

Bash также позволяет выполнять арифметические операции с переменными.

  1. Создайте новый файл с именем arithmetic_operations.sh в каталоге проекта:
#!/bin/bash

## Assigning numeric values
x=5
y=3

## Basic arithmetic operations
sum=$((x + y))
difference=$((x - y))
product=$((x * y))
quotient=$((x / y))
remainder=$((x % y))

## Display results
echo "x = $x, y = $y"
echo "Sum: $x + $y = $sum"
echo "Difference: $x - $y = $difference"
echo "Product: $x * $y = $product"
echo "Quotient: $x / $y = $quotient"
echo "Remainder: $x % $y = $remainder"

## Increment and decrement
echo "Initial value of x: $x"
x=$((x + 1))
echo "After increment: $x"
x=$((x - 1))
echo "After decrement: $x"

## Compound assignment operators
x+=5
echo "After x+=5: $x"
x-=2
echo "After x-=2: $x"
  1. Сохраните файл и сделайте его исполняемым:
chmod +x arithmetic_operations.sh
  1. Запустите скрипт:
./arithmetic_operations.sh

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

x = 5, y = 3
Sum: 5 + 3 = 8
Difference: 5 - 3 = 2
Product: 5 * 3 = 15
Quotient: 5 / 3 = 1
Remainder: 5 % 3 = 2
Initial value of x: 5
After increment: 6
After decrement: 5
After x+=5: 10
After x-=2: 8

Чтение пользовательского ввода в переменные

Переменные также могут хранить ввод, предоставленный пользователями. Давайте создадим скрипт, который запрашивает ввод у пользователя:

  1. Создайте файл с именем user_input.sh:
#!/bin/bash

## Prompt the user for their name
echo "What is your name?"
read user_name

## Prompt the user for their age
echo "How old are you?"
read user_age

## Display the information
echo "Hello, $user_name! You are $user_age years old."

## Calculate birth year (approximate)
current_year=$(date +%Y)
birth_year=$((current_year - user_age))
echo "You were likely born in $birth_year."
  1. Сохраните файл и сделайте его исполняемым:
chmod +x user_input.sh
  1. Запустите скрипт:
./user_input.sh
  1. При появлении запроса введите свое имя и возраст. Скрипт отобразит приветствие и рассчитает ваш приблизительный год рождения.

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

Использование переменных в скриптах и командах

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

Создание базового скрипта с переменными

Давайте создадим скрипт, который вычисляет общую стоимость товаров в корзине покупок:

  1. Создайте новый файл с именем shopping_cart.sh в каталоге проекта:
#!/bin/bash

## Initialize variables for items and their prices
item1="Laptop"
price1=999
item2="Headphones"
price2=149
item3="Mouse"
price3=25

## Calculate the total price
total=$((price1 + price2 + price3))

## Display the shopping cart
echo "Shopping Cart:"
echo "-------------"
echo "$item1: \$$price1"
echo "$item2: \$$price2"
echo "$item3: \$$price3"
echo "-------------"
echo "Total: \$$total"

## Apply a discount if the total is over $1000
discount_threshold=1000
discount_rate=10

if [ $total -gt $discount_threshold ]; then
  discount_amount=$((total * discount_rate / 100))
  discounted_total=$((total - discount_amount))
  echo "Discount (${discount_rate}%): -\$$discount_amount"
  echo "Final Total: \$$discounted_total"
fi
  1. Сохраните файл и сделайте его исполняемым:
chmod +x shopping_cart.sh
  1. Запустите скрипт:
./shopping_cart.sh

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

Shopping Cart:
-------------
Laptop: $999
Headphones: $149
Mouse: $25
-------------
Total: $1173
Discount (10%): -$117
Final Total: $1056

Использование переменных с подстановкой команд

Подстановка команд (command substitution) позволяет вам захватывать вывод команды и сохранять его в переменной. Давайте создадим скрипт, который это демонстрирует:

  1. Создайте новый файл с именем system_info.sh:
#!/bin/bash

## Get current date and time
current_date=$(date +"%Y-%m-%d")
current_time=$(date +"%H:%M:%S")

## Get system information
hostname=$(hostname)
os_type=$(uname -s)
kernel_version=$(uname -r)
uptime_info=$(uptime -p)
memory_free=$(free -h | awk '/^Mem:/ {print $4}')
disk_free=$(df -h / | awk 'NR==2 {print $4}')

## Display the information
echo "System Information Report"
echo "========================="
echo "Date: $current_date"
echo "Time: $current_time"
echo "Hostname: $hostname"
echo "OS Type: $os_type"
echo "Kernel Version: $kernel_version"
echo "Uptime: $uptime_info"
echo "Free Memory: $memory_free"
echo "Free Disk Space: $disk_free"
  1. Сохраните файл и сделайте его исполняемым:
chmod +x system_info.sh
  1. Запустите скрипт:
./system_info.sh

Вы должны увидеть вывод, похожий на следующий (со значениями, специфичными для вашей системы):

System Information Report
=========================
Date: 2023-11-20
Time: 14:30:25
Hostname: labex
OS Type: Linux
Kernel Version: 5.15.0-1015-aws
Uptime: up 2 hours, 15 minutes
Free Memory: 1.2Gi
Free Disk Space: 15G

Использование переменных в циклах

Переменные особенно полезны в циклах. Давайте создадим скрипт, который это демонстрирует:

  1. Создайте новый файл с именем countdown.sh:
#!/bin/bash

## Get countdown start value from user
echo "Enter a number to start countdown:"
read count

## Validate that input is a number
if [[ ! $count =~ ^[0-9]+$ ]]; then
  echo "Error: Please enter a valid number"
  exit 1
fi

## Perform countdown
echo "Starting countdown from $count:"
while [ $count -gt 0 ]; do
  echo $count
  count=$((count - 1))
  sleep 1
done

echo "Blast off!"
  1. Сохраните файл и сделайте его исполняемым:
chmod +x countdown.sh
  1. Запустите скрипт:
./countdown.sh
  1. Введите небольшое число (например, 5) при появлении запроса.

Скрипт будет отсчитывать от введенного вами числа, печатая каждое число, а затем "Blast off!" в конце.

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

Область видимости переменных и специальные переменные

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

Понимание области видимости переменных

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

  1. Глобальные переменные (Global variables): Они доступны во всем скрипте.
  2. Локальные переменные (Local variables): Они доступны только внутри определенной функции или блока.

Давайте создадим скрипт для демонстрации области видимости переменных:

  1. Создайте новый файл с именем variable_scope.sh:
#!/bin/bash

## Global variable
global_var="I am a global variable"

## Function that demonstrates variable scope
demo_scope() {
  ## Local variable
  local local_var="I am a local variable"

  ## Access global variable
  echo "Inside function: global_var = $global_var"

  ## Access local variable
  echo "Inside function: local_var = $local_var"

  ## Modify global variable
  global_var="Global variable modified"
}

## Main script
echo "Before function call: global_var = $global_var"

## This will fail because local_var doesn't exist yet
echo "Before function call: local_var = $local_var"

## Call the function
demo_scope

## After function call
echo "After function call: global_var = $global_var"

## This will fail because local_var is only accessible within the function
echo "After function call: local_var = $local_var"
  1. Сохраните файл и сделайте его исполняемым:
chmod +x variable_scope.sh
  1. Запустите скрипт:
./variable_scope.sh

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

Before function call: global_var = I am a global variable
Before function call: local_var =
Inside function: global_var = I am a global variable
Inside function: local_var = I am a local variable
After function call: global_var = Global variable modified
After function call: local_var =

Обратите внимание, что:

  • Глобальная переменная global_var доступна как внутри, так и за пределами функции.
  • Локальная переменная local_var доступна только внутри функции.
  • Изменения глобальной переменной сохраняются после завершения функции.

Работа со специальными переменными

Bash предоставляет несколько специальных переменных, которые содержат определенную информацию. Давайте рассмотрим некоторые из них:

  1. Создайте новый файл с именем special_variables.sh:
#!/bin/bash

## Special variables demonstration
echo "Script name: $0"
echo "Process ID: $$"
echo "Number of arguments: $#"
echo "All arguments: $@"
echo "Exit status of last command: $?"
echo "Current user: $USER"
echo "Current hostname: $HOSTNAME"
echo "Random number: $RANDOM"

## Function to demonstrate positional parameters
show_params() {
  echo "Function received $## parameters"
  echo "Parameter 1: $1"
  echo "Parameter 2: $2"
  echo "Parameter 3: $3"
}

## Call the function with parameters
echo -e "\nCalling function with parameters:"
show_params apple banana cherry

## Demonstrate positional parameters to the script
echo -e "\nScript positional parameters:"
echo "Parameter 1: $1"
echo "Parameter 2: $2"
echo "Parameter 3: $3"
  1. Сохраните файл и сделайте его исполняемым:
chmod +x special_variables.sh
  1. Запустите скрипт с некоторыми аргументами:
./special_variables.sh arg1 arg2 arg3

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

Script name: ./special_variables.sh
Process ID: 12345
Number of arguments: 3
All arguments: arg1 arg2 arg3
Exit status of last command: 0
Current user: labex
Current hostname: labex
Random number: 23456

Calling function with parameters:
Function received 3 parameters
Parameter 1: apple
Parameter 2: banana
Parameter 3: cherry

Script positional parameters:
Parameter 1: arg1
Parameter 2: arg2
Parameter 3: arg3

Переменные окружения

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

  1. Создайте новый файл с именем environment_variables.sh:
#!/bin/bash

## Display common environment variables
echo "HOME directory: $HOME"
echo "Current user: $USER"
echo "Shell: $SHELL"
echo "Path: $PATH"
echo "Current working directory: $PWD"
echo "Terminal: $TERM"
echo "Language: $LANG"

## Creating and exporting a new environment variable
echo -e "\nCreating a new environment variable:"
MY_VAR="Hello from environment variable"
export MY_VAR
echo "MY_VAR = $MY_VAR"

## Demonstrate that child processes inherit environment variables
echo -e "\nAccessing environment variable from a child process:"
bash -c 'echo "Child process sees MY_VAR = $MY_VAR"'

## Remove the environment variable
echo -e "\nRemoving the environment variable:"
unset MY_VAR
echo "MY_VAR = $MY_VAR (should be empty)"
  1. Сохраните файл и сделайте его исполняемым:
chmod +x environment_variables.sh
  1. Запустите скрипт:
./environment_variables.sh

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

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

Резюме

В этой лабораторной работе вы изучили основы работы с переменными в скриптах Bash. Вы получили практический опыт работы с:

  • Созданием и присваиванием значений переменным
  • Работой со строковыми операциями и арифметическими вычислениями
  • Использованием переменных в скриптах и командах
  • Пониманием области видимости переменных и работой со специальными переменными

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

Продолжая свой путь в написании скриптов Bash, помните эти ключевые моменты:

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

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