Введение
Скриптинг в оболочке (shell scripting) – мощный инструмент для автоматизации задач в Linux-средах. Одним из фундаментальных навыков в программировании оболочки является работа с переменными – временными хранилищами данных. Этот учебник проведет вас через процесс создания переменных и вывода их значений в скриптах оболочки. К концу этой лабораторной работы вы поймете, как объявлять переменные, получать доступ к их значениям и включать их в практические скрипты оболочки.
Создание вашего первого скрипта оболочки с переменными
Давайте начнем с создания простого скрипта оболочки, который демонстрирует, как объявлять и использовать переменные.
Что такое переменные оболочки?
Переменные оболочки – это именованные области хранения, которые могут содержать значения в скриптах оболочки. Они позволяют хранить и извлекать данные, такие как текстовые строки, числа, пути к файлам и выводы команд. Переменные делают ваши скрипты более гибкими и пригодными для повторного использования.
Создание вашего первого скрипта
Давайте создадим файл скрипта оболочки:
- Откройте терминал WebIDE
- Перейдите в каталог проекта (если вы еще не там):
cd ~/project - Создайте новый файл с именем
myscript.shс помощью редактора WebIDE:- Нажмите на значок "New File" в WebIDE
- Назовите его
myscript.sh - Добавьте следующее содержимое в файл:
#!/bin/bash
## This is my first shell script with variables
## Declaring a variable
name="LabEx User"
## Printing the variable
echo "Hello, $name!"
## Printing the current date using a variable
current_date=$(date)
echo "Today is: $current_date"
Сохраните файл, нажав Ctrl+S или выбрав File > Save
Сделайте скрипт исполняемым с помощью следующей команды:
chmod +x myscript.shЗапустите ваш скрипт:
./myscript.sh
Вы должны увидеть вывод, похожий на этот:
Hello, LabEx User!
Today is: Thu Jul 13 10:30:45 UTC 2023
Понимание скрипта
Давайте разберем, что произошло в нашем скрипте:
- Первая строка
#!/bin/bash(называемая shebang) указывает системе использовать оболочку Bash для выполнения скрипта. - Мы создали переменную с именем
nameи присвоили ей значение "LabEx User" с помощьюname="LabEx User". - Мы вывели значение переменной с помощью
echo "Hello, $name!". Символ$перед именем переменной указывает оболочке подставить значение переменной. - Мы создали другую переменную
current_dateи присвоили ей вывод командыdateс помощью$(date). - Мы вывели значение переменной
current_date.
Правила именования переменных
При создании переменных в скриптах оболочки следуйте этим соглашениям об именовании:
- Имена переменных могут содержать буквы, цифры и символы подчеркивания
- Они должны начинаться с буквы или символа подчеркивания
- Пробелы вокруг знака равенства при присваивании значений не допускаются
- Имена переменных чувствительны к регистру (NAME, name и Name – три разные переменные)
Попробуйте изменить скрипт, чтобы включить свои собственные переменные, и запустите его снова, чтобы увидеть результаты.
Различные способы вывода значений переменных
Теперь, когда вы понимаете основы создания переменных, давайте рассмотрим различные методы вывода их значений в скриптах оболочки.
Использование двойных кавычек
Наиболее распространенный способ вывода переменных – использование двойных кавычек с командой echo. Двойные кавычки позволяют оболочке интерпретировать имена переменных и подставлять их значения.
Создайте новый файл с именем print_variables.sh:
- Нажмите на значок "New File" в WebIDE
- Назовите его
print_variables.sh - Добавьте следующее содержимое:
#!/bin/bash
## Declaring variables
name="LabEx"
version=1.0
is_active=true
## Printing variables with double quotes
echo "Application name: $name"
echo "Version: $version"
echo "Active status: $is_active"
## Printing multiple variables in one statement
echo "The $name application version $version is $is_active"
- Сохраните файл (Ctrl+S или File > Save)
- Сделайте его исполняемым:
chmod +x print_variables.sh - Запустите скрипт:
./print_variables.sh
Вы должны увидеть вывод, похожий на:
Application name: LabEx
Version: 1.0
Active status: true
The LabEx application version 1.0 is true
Использование фигурных скобок
Иногда вам нужно быть более точным в отношении того, где начинается и заканчивается имя переменной. Фигурные скобки помогают в этом, четко обозначая имя переменной.
Добавьте следующие строки в ваш скрипт print_variables.sh:
## Using curly braces to clearly define variable boundaries
app="${name}App"
echo "Application full name: $app"
## This avoids confusion when you want to append text directly to a variable's value
echo "Application name with text: ${name}Text"
Сохраните и снова запустите скрипт:
./print_variables.sh
Дополнительный вывод должен показать:
Application full name: LabExApp
Application name with text: LabExText
Использование одинарных кавычек
В отличие от двойных кавычек, одинарные кавычки предотвращают подстановку переменных и выводят буквальный текст.
Добавьте эти строки в ваш скрипт:
## Using single quotes (no variable substitution)
echo 'With single quotes: $name is not replaced'
## Mixing quote types for complex output
echo "This is the variable value: '$name'"
Сохраните и снова запустите скрипт. Вы должны увидеть:
With single quotes: $name is not replaced
This is the variable value: 'LabEx'
Использование printf для форматированного вывода
Команда printf предлагает больше контроля над форматированием вашего вывода:
## Using printf for formatted output
printf "Name: %s\nVersion: %.1f\n" "$name" "$version"
## Formatting numbers with printf
number=42.5678
printf "Formatted number: %.2f\n" $number
Сохраните и снова запустите скрипт. Дополнительный вывод покажет:
Name: LabEx
Version: 1.0
Formatted number: 42.57
Попробуйте поэкспериментировать с различными методами вывода, чтобы увидеть, какие из них лучше всего подходят для ваших нужд.
Создание практичного скрипта оболочки с вводом от пользователя
Теперь давайте создадим более практичный скрипт оболочки, который принимает ввод от пользователя, сохраняет его в переменных и отображает результаты.
Чтение ввода от пользователя
Команда read позволяет вашему скрипту принимать ввод от пользователей. Давайте создадим простой скрипт приветствия:
- Создайте новый файл с именем
greeting.sh:- Нажмите на значок "New File" в WebIDE
- Назовите его
greeting.sh - Добавьте следующее содержимое:
#!/bin/bash
## Simple greeting script that takes user input
## Prompt the user for their name
echo "What is your name?"
read username
## Prompt for age
echo "How old are you?"
read age
## Display a greeting with the provided information
echo "Hello, $username! You are $age years old."
## Calculate birth year (approximately)
current_year=$(date +%Y)
birth_year=$((current_year - age))
echo "You were born around the year $birth_year."
## Adding a personalized message based on age
if [ $age -lt 18 ]; then
echo "You are a minor."
elif [ $age -ge 18 ] && [ $age -lt 65 ]; then
echo "You are an adult."
else
echo "You are a senior."
fi
Сохраните файл (Ctrl+S или File > Save)
Сделайте его исполняемым:
chmod +x greeting.shЗапустите скрипт:
./greeting.shКогда появится запрос, введите свое имя и возраст. Вы должны увидеть персонализированный вывод на основе вашего ввода.
Понимание компонентов скрипта
Давайте разберем ключевые части этого скрипта:
- Команда
readсохраняет ввод пользователя в переменные (usernameиage). - Мы используем переменные в операторах echo для создания персонализированного вывода.
- Мы выполняем арифметические операции, используя синтаксис
$((expression))для вычисления года рождения. - Мы используем условные операторы (
if,elif,else) для предоставления разных сообщений в зависимости от значения возраста. - Мы используем команду
dateс параметрами форматирования, чтобы получить текущий год.
Сделаем скрипт более интерактивным
Давайте улучшим наш скрипт, чтобы сделать его более интерактивным и полезным. Добавьте следующее в ваш файл greeting.sh:
## Ask if the user wants to see the current system information
echo "Would you like to see some system information? (yes/no)"
read response
## Convert the response to lowercase for easier comparison
response_lower=$(echo "$response" | tr '[:upper:]' '[:lower:]')
if [ "$response_lower" = "yes" ] || [ "$response_lower" = "y" ]; then
echo "System information for user $username:"
echo "-------------------------------------"
echo "Hostname: $(hostname)"
echo "Kernel version: $(uname -r)"
echo "System uptime: $(uptime -p)"
echo "CPU information: $(grep "model name" /proc/cpuinfo | head -1 | cut -d: -f2 | sed 's/^[ \t]*//')"
echo "Memory available: $(free -h | grep Mem | awk '{print $7}')"
echo "-------------------------------------"
else
echo "No problem, $username. Have a great day!"
fi
Сохраните файл и запустите его снова:
./greeting.sh
Следуйте подсказкам и введите "yes", когда вас спросят, хотите ли вы увидеть информацию о системе. Вы должны увидеть подробную информацию о системе.
Этот скрипт демонстрирует, как:
- Читать и обрабатывать ввод пользователя
- Хранить и манипулировать переменными
- Выполнять вычисления
- Принимать решения на основе значений переменных
- Выполнять системные команды и сохранять их выводы в переменных
- Отображать форматированный вывод для пользователя
Попробуйте изменить скрипт, чтобы добавить больше интерактивных функций или различные типы информации о системе.
Создание скрипта оболочки для операций с файлами
Давайте применим наши знания о переменных оболочки для создания полезного скрипта, который выполняет файловые операции. Этот скрипт продемонстрирует, как переменные могут помочь автоматизировать задачи управления файлами.
Создание скрипта резервного копирования
Давайте создадим скрипт, который создает резервную копию файлов в указанном каталоге:
Сначала давайте создадим тестовый каталог и несколько примеров файлов для работы:
mkdir -p ~/project/test_files echo "This is file 1" > ~/project/test_files/file1.txt echo "This is file 2" > ~/project/test_files/file2.txt echo "This is file 3" > ~/project/test_files/file3.txtТеперь создайте новый файл с именем
backup.sh:- Нажмите на значок "New File" в WebIDE
- Назовите его
backup.sh - Добавьте следующее содержимое:
#!/bin/bash
## A script to backup files from a source directory to a backup directory
## Define variables for directories
source_dir="$HOME/project/test_files"
backup_dir="$HOME/project/backup"
date_stamp=$(date +"%Y%m%d_%H%M%S")
backup_name="backup_$date_stamp"
## Print the script's purpose
echo "File Backup Script"
echo "==================="
echo "Source directory: $source_dir"
echo "Backup directory: $backup_dir/$backup_name"
## Create the backup directory if it doesn't exist
if [ ! -d "$backup_dir" ]; then
echo "Creating backup directory: $backup_dir"
mkdir -p "$backup_dir"
fi
## Create a timestamped backup directory
mkdir -p "$backup_dir/$backup_name"
## Check if source directory exists
if [ ! -d "$source_dir" ]; then
echo "Error: Source directory $source_dir does not exist!"
exit 1
fi
## Count the number of files in the source directory
file_count=$(ls -1 "$source_dir" | wc -l)
echo "Found $file_count files in the source directory."
## Copy the files to the backup directory
echo "Copying files to backup location..."
cp -r "$source_dir"/* "$backup_dir/$backup_name"
## Verify the copy operation
copied_count=$(ls -1 "$backup_dir/$backup_name" | wc -l)
echo "Copied $copied_count files to the backup directory."
## Check if all files were copied successfully
if [ "$file_count" -eq "$copied_count" ]; then
echo "Backup completed successfully!"
else
echo "Warning: Not all files were copied. Please check for errors."
fi
## List the contents of the backup directory
echo "Contents of the backup directory:"
ls -la "$backup_dir/$backup_name"
## Display the total size of the backup
backup_size=$(du -sh "$backup_dir/$backup_name" | cut -f1)
echo "Total backup size: $backup_size"
- Сохраните файл (Ctrl+S или File > Save)
- Сделайте его исполняемым:
chmod +x backup.sh - Запустите скрипт:
./backup.sh
Вы должны увидеть вывод, показывающий процесс резервного копирования, включая:
- Исходный каталог и каталог резервного копирования
- Количество найденных файлов
- Подтверждение операции копирования
- Содержимое каталога резервного копирования
- Общий размер резервной копии
Понимание скрипта
Этот скрипт резервного копирования демонстрирует несколько важных концепций:
- Использование переменных: Мы используем переменные для хранения путей к каталогам, меток времени и подсчетов.
- Подстановка команд: Мы используем синтаксис
$(command)для захвата вывода команды в переменные. - Условные операторы: Мы используем операторы
ifдля проверки существования каталогов. - Манипуляции со строками: Мы создаем уникальное имя резервной копии, используя метку времени.
- Переменные пути: Мы используем
$HOMEдля ссылки на домашний каталог пользователя. - Выполнение команд: Мы используем команды оболочки, такие как
mkdir,cpиls, в нашем скрипте. - Коды выхода: Мы используем
exit 1для завершения скрипта с состоянием ошибки.
Улучшение скрипта резервного копирования
Давайте изменим наш скрипт, чтобы он принимал пользовательский исходный каталог от пользователя:
- Откройте
backup.shв редакторе - Замените содержимое следующим:
#!/bin/bash
## A script to backup files from a source directory to a backup directory
## Check if a source directory was provided
if [ $## -eq 0 ]; then
## No argument provided, use default directory
source_dir="$HOME/project/test_files"
echo "No source directory specified, using default: $source_dir"
else
## Use the provided directory
source_dir="$1"
echo "Using specified source directory: $source_dir"
fi
## Define variables for directories
backup_dir="$HOME/project/backup"
date_stamp=$(date +"%Y%m%d_%H%M%S")
backup_name="backup_$date_stamp"
## Print the script's purpose
echo "File Backup Script"
echo "==================="
echo "Source directory: $source_dir"
echo "Backup directory: $backup_dir/$backup_name"
## Create the backup directory if it doesn't exist
if [ ! -d "$backup_dir" ]; then
echo "Creating backup directory: $backup_dir"
mkdir -p "$backup_dir"
fi
## Create a timestamped backup directory
mkdir -p "$backup_dir/$backup_name"
## Check if source directory exists
if [ ! -d "$source_dir" ]; then
echo "Error: Source directory $source_dir does not exist!"
exit 1
fi
## Count the number of files in the source directory
file_count=$(ls -1 "$source_dir" | wc -l)
echo "Found $file_count files in the source directory."
## Copy the files to the backup directory
echo "Copying files to backup location..."
cp -r "$source_dir"/* "$backup_dir/$backup_name"
## Verify the copy operation
copied_count=$(ls -1 "$backup_dir/$backup_name" | wc -l)
echo "Copied $copied_count files to the backup directory."
## Check if all files were copied successfully
if [ "$file_count" -eq "$copied_count" ]; then
echo "Backup completed successfully!"
else
echo "Warning: Not all files were copied. Please check for errors."
fi
## List the contents of the backup directory
echo "Contents of the backup directory:"
ls -la "$backup_dir/$backup_name"
## Display the total size of the backup
backup_size=$(du -sh "$backup_dir/$backup_name" | cut -f1)
echo "Total backup size: $backup_size"
- Сохраните файл
- Запустите скрипт с пользовательским каталогом:
./backup.sh ~/project
Улучшенный скрипт теперь демонстрирует:
- Аргументы командной строки, используя
$1(первый аргумент, переданный скрипту) - Значения по умолчанию, когда аргументы не предоставлены
- Проверку параметров с помощью
$#(количество аргументов)
Этот скрипт резервного копирования является практическим примером того, как переменные оболочки могут использоваться для создания полезных, гибких инструментов для автоматизации задач управления файлами.
Резюме
В этой лабораторной работе вы изучили основные навыки работы с переменными в скриптах оболочки:
- Создание и объявление переменных оболочки
- Различные способы вывода значений переменных с использованием echo, printf и кавычек
- Чтение и обработка ввода от пользователя
- Выполнение вычислений с использованием переменных оболочки
- Использование переменных для операций с файлами и задач резервного копирования
- Обработка аргументов командной строки
Эти навыки формируют прочную основу для написания скриптов оболочки и позволят вам создавать более динамичные и гибкие скрипты для автоматизации различных задач в среде Linux. Продолжая свой путь в написании скриптов оболочки, вы можете опираться на эти концепции для разработки более сложных скриптов для администрирования системы, управления файлами и задач обработки данных.



