Лаб. работа “Язык командного энтерпритатора Shell”
Цель лабораторной работы
Освоение основ работы с языком командного интерпретатора Shell, изучение основных команд и возможностей Shell, а также развитие навыков написания простых скриптов для автоматизации задач в операционной системе Unix/Linux.
Задачи лабораторной работы
- Знакомство с командной строкой Unix/Linux:
- Ознакомиться с основными командами Shell (например,
ls
,cd
,pwd
,cp
,mv
,rm
). - Понять структуру и синтаксис командной строки.
- Научиться навигации по файловой системе с помощью команд Shell.
- Ознакомиться с основными командами Shell (например,
- Изучение команд обработки файлов и каталогов:
- Научиться использовать команды для работы с файлами и каталогами (
touch
,mkdir
,rmdir
,nano
,cat
,less
,more
). - Освоить команды для поиска файлов (
find
,grep
).
- Научиться использовать команды для работы с файлами и каталогами (
- Изучение перенаправления ввода/вывода и работы с конвейерами:
- Изучить основы перенаправления ввода/вывода с помощью символов
>
,>>
,<
. - Понять принципы работы с конвейерами (pipes) с использованием символа
|
.
- Изучить основы перенаправления ввода/вывода с помощью символов
- Автоматизация задач с помощью скриптов:
- Научиться писать простые скрипты на Shell, включая использование переменных и операторов управления (
if
,for
,while
). - Ознакомиться с созданием и использованием функций в скриптах Shell.
- Научиться писать простые скрипты на Shell, включая использование переменных и операторов управления (
- Работа с системными процессами:
- Изучить команды для управления процессами (
ps
,top
,kill
,bg
,fg
,jobs
). - Понять, как отслеживать и контролировать выполнение программ в Shell.
- Изучить команды для управления процессами (
- Основы безопасности и прав доступа:
- Изучить команды для управления правами доступа к файлам и каталогам (
chmod
,chown
,chgrp
). - Понять основы работы с пользователями и группами в Unix/Linux.
- Изучить команды для управления правами доступа к файлам и каталогам (
- Практическое применение:
- Выполнить ряд практических заданий, направленных на применение изученных команд и написание скриптов для автоматизации реальных задач.
Краткие теоретические сведения
Структура скрипта Shell
Рассмотрим структуру скрипта Shell:
#!/bin/bash
# Комментарий: Начало скрипта
# Объявление переменных
VAR1="Hello"
VAR2="World"
# Основная часть скрипта
echo "$VAR1 $VAR2" # Выводит "Hello World"
# Завершение скрипта
exit 0
Шебанг (Shebang):
#!/bin/bash
- это строка в начале скрипта, указывающая на то, какой интерпретатор использовать. В данном случае используется интерпретатор Bash.Комментарии: Комментарии помогают описать, что делает скрипт. Они начинаются с символа
#
и игнорируются интерпретатором.Объявление переменных: Здесь объявляются переменные
VAR1
иVAR2
, которые содержат строки “Hello” и “World” соответственно.Основная часть скрипта: Это место, где выполняются основные действия. В данном случае, скрипт просто выводит содержимое переменных с помощью команды
echo
.Завершение скрипта: Команда
exit 0
указывает на успешное завершение скрипта. Код0
обычно означает успешное выполнение, а другие значения могут указывать на различные ошибки или условия завершения.
Переменные
Переменные в shell играют ключевую роль, позволяя хранить и использовать данные в скриптах.
Объявление переменных: Переменные объявляются без использования ключевых слов, просто путем присваивания значения. Например:
Использование переменных: Для использования переменной в тексте скрипта нужно указать её имя, предваряя его символом доллара
$
. Например:Специальные переменные: В shell есть множество специальных переменных, таких как
$0
,$1
,$2
, и т.д., которые хранят аргументы командной строки. Например:Чтение значений из ввода: Можно использовать команду
read
, чтобы прочитать значение из ввода и присвоить его переменной. Например:Удаление переменных: Для удаления переменной используется команда
unset
. Например:Интерполяция переменных: Переменные могут быть интерполированы в строковых значениях. Например:
Переменные окружения: Все переменные, которые вы экспортируете из shell, становятся переменными окружения для любых запущенных подкоманд или программ. Например:
Именованные переменные: В bash и других расширениях shell можно использовать ассоциативные массивы для хранения данных. Например:
Специальные переменные
Специальные переменные в shell представляют собой переменные, которые предопределены и предназначены для выполнения определенных задач.
$0: Имя исполняемого файла скрипта (имя команды).
$1, $2, …, $N: Параметры командной строки. $1 содержит первый аргумент, $2 — второй, и так далее.
$@: Список всех аргументов командной строки.
$#: Количество аргументов командной строки.
$?: Код возврата (exit code) последней выполненной команды.
$$: PID (идентификатор процесса) текущего shell.
$!: PID последнего запущенного в фоновом режиме процесса.
$*: Похоже на $@, но сохраняет аргументы как одну строку.
$IFS: Разделитель полей (Internal Field Separator). Это строка символов, которая определяет, где shell должен разбивать строки на поля, при чтении из ввода или из переменной.
$PWD: Текущий рабочий каталог (полный путь).
$OLDPWD: Предыдущий рабочий каталог.
Переменные окружения
Переменные окружения представляют собой переменные, которые могут быть установлены в системе операционной или виртуальной среде и доступны для всех процессов, запущенных в этой среде. Они могут содержать различную информацию о системе, пользователе, конфигурации и многое другое.
PATH: Содержит список каталогов, в которых операционная система ищет исполняемые файлы.
HOME: Путь к домашнему каталогу текущего пользователя.
USER: Имя текущего пользователя.
LANG: Определяет язык, используемый для отображения сообщений и форматирования даты и времени.
TERM: Определяет тип терминала, используемого для взаимодействия с пользователем.
PWD: Текущий рабочий каталог.
SHELL: Путь к оболочке, используемой текущим пользователем.
DISPLAY: Определяет, на каком дисплее должны отображаться графические приложения.
TMP, TEMP: Пути к временным каталогам.
EDITOR, VISUAL: Определяют текстовый редактор, используемый по умолчанию.
TZ: Определяет часовой пояс системы.
HOSTNAME: Имя хоста (имя компьютера).
PS1, PS2: Переменные, используемые для настройки приглашения командной строки.
LD_LIBRARY_PATH: Список каталогов, в которых операционная система ищет библиотеки, используемые программами.
JAVA_HOME: Путь к установленной JDK (Java Development Kit).
Эти переменные можно использовать в shell скриптах для доступа к информации о среде выполнения и для настройки поведения программы в соответствии с окружением. Для просмотра всех переменных окружения в вашей текущей среде выполнения вы можете использовать команду env
в большинстве Unix-подобных систем.
Операторы ветвления
Операторы ветвления в shell используются для принятия решений на основе условий и выполнения различных действий в зависимости от результатов этих условий.
if-then-else:
Пример:
if-then (без else):
Пример:
if-elif-else:
if условие1; then команды_если_условие1_истинно elif условие2; then команды_если_условие2_истинно else команды_если_все_условия_ложны fi
Пример:
case:
case выражение in паттерн1) команды_если_паттерн1_соответствует ;; паттерн2) команды_если_паттерн2_соответствует ;; *) команды_если_нет_соответствия_ни_одному_паттерну ;; esac
Пример:
Эти операторы ветвления позволяют создавать гибкие скрипты, которые могут выполнять различные действия в зависимости от условий, и обеспечивают управление потоком выполнения программы в shell.
Предикаты
В контексте программирования “предикат” обычно означает выражение, которое оценивается как истинное или ложное. В языках программирования, включая shell, предикаты используются в операторах ветвления (например, в операторах if
, while
, case
и других) для принятия решений на основе условий.
Сравнение чисел:
-eq
: равно-ne
: не равно-gt
: больше-lt
: меньше-ge
: больше или равно-le
: меньше или равно
Например:
Сравнение строк:
=
: равно!=
: не равно-z
: пустая строка-n
: не пустая строка
Например:
Файловые предикаты:
-e
: файл существует-f
: обычный файл-d
: каталог-r
: доступен для чтения-w
: доступен для записи-x
: доступен для выполнения
Например:
Логические операции:
-a
: логическое “и”-o
: логическое “или”!
: логическое “не”
Например:
Эти предикаты позволяют создавать условия в операторах ветвления, которые позволяют программам принимать решения и выполнять различные действия на основе этих условий.
Операторы циклов
В shell скриптах часто используются циклы для повторения определенных действий определенное количество раз или до выполнения определенного условия.
Цикл while:
Например:
Цикл until:
Например:
Цикл for (для перебора элементов в списке):
Например:
Цикл for (для перебора элементов в массиве или списке):
Например:
Цикл select (для создания интерактивного меню):
Например:
Эти циклы могут использоваться для автоматизации повторяющихся задач, обработки данных, итерации по спискам и многих других вещей в shell скриптах.
Вызов сторонних программ
Вызов сторонних программ из shell скриптов - обычная практика, которая позволяет скриптам взаимодействовать с другими программами и выполнять различные задачи. Для вызова сторонней программы используются команды, которые могут быть исполнены внутри скрипта.
Вызов программы по её имени:
Например:
Использование переменных в качестве аргументов:
Например:
Подстановка вывода другой команды:
Например:
Использование обратных кавычек для подстановки вывода команды (устаревший метод):
Например:
Пайплайны (|) для передачи вывода одной команды в качестве входных данных другой:
Например:
Перенаправление вывода (stdout и stderr):
Например:
Перенаправление ввода:
Например:
Это основные способы вызова сторонних программ из shell скриптов. Они позволяют взаимодействовать со стандартными командами операционной системы, а также с любыми другими программами, доступными в вашей среде выполнения.
Математические вычисления
В shell скриптах можно выполнить математические вычисления несколькими способами.
Арифметическое выражение с помощью встроенной команды
let
:Например:
Арифметическое выражение с помощью двойных круглых скобок
((...))
:Например:
Использование команды
expr
:Например:
Использование конструкции
$((...))
:Например:
Использование встроенной команды
bc
для вычисления выражений с плавающей запятой:Например:
Каждый из этих методов имеет свои особенности и подходит для разных типов вычислений. Например, let
и ((...))
работают только с целыми числами, в то время как bc
поддерживает вычисления с плавающей запятой.
Пользовательские функции
В shell скриптах вы можете определять пользовательские функции для организации и структурирования вашего кода. Вот пример определения и вызова пользовательской функции:
# Определение функции
function my_function {
echo "Привет, это моя пользовательская функция!"
}
# Вызов функции
my_function
Этот пример определяет функцию с именем my_function
, которая выводит приветственное сообщение. После определения функции она вызывается с помощью my_function
.
Ниже приведены некоторые дополнительные концепции, которые могут быть полезны при работе с пользовательскими функциями:
Передача аргументов в функцию:
Этот пример передает строку “Мир” в функцию
my_function
, которая выводит “Привет, Мир!”.Возврат значений из функции:
function add_numbers { local result=$(( $1 + $2 )) echo $result } sum=$(add_numbers 5 3) echo "Сумма: $sum"
Этот пример определяет функцию
add_numbers
, которая принимает два аргумента, складывает их и возвращает результат. Результат сохраняется в переменнойsum
.Локальные переменные в функции:
function my_function { local name="John" echo "Привет, $name!" } my_function echo "Имя: $name" # Это вызовет ошибку, потому что переменная name является локальной для функции
В этом примере переменная
name
является локальной для функцииmy_function
и недоступна за её пределами.Рекурсивные функции:
function factorial { if [ $1 -le 1 ]; then echo 1 else local prev=$(factorial $(( $1 - 1 ))) echo $(( $1 * $prev )) fi } result=$(factorial 5) echo "Факториал 5: $result"
В этом примере определена рекурсивная функция для вычисления факториала числа. Функция вызывает саму себя до тех пор, пока не достигнет базового случая.
Порядок выполнения работы
- Переменные Shell:
- Создайте скрипт, который запрашивает у пользователя его имя и приветствует его с использованием этого имени.
- Напишите скрипт, который запрашивает у пользователя два числа и выводит их сумму.
- Переменные окружения:
- Напишите скрипт, который выводит значения некоторых системных переменных окружения, таких как
$HOME
,$PATH
,$USER
, и т.д. - Создайте скрипт, который выводит список всех переменных окружения.
- Напишите скрипт, который выводит значения некоторых системных переменных окружения, таких как
- Операторы ветвления:
- Напишите скрипт, который проверяет, является ли введенное пользователем число четным или нечетным, и выводит соответствующее сообщение.
- Создайте скрипт, который запрашивает у пользователя его возраст и сообщает, является ли он совершеннолетним или нет.
- Оператор выбора:
- Напишите скрипт, который запрашивает у пользователя его любимый сезон и выводит сообщение о том, какие виды активностей связаны с этим сезоном.
- Создайте скрипт, который проверяет введенную пользователем строку на наличие ключевого слова и выводит соответствующее сообщение.
- Операторы циклов:
- Напишите скрипт, который выводит числа от 1 до 10 с использованием цикла
for
. - Создайте скрипт, который запрашивает у пользователя число и выводит таблицу умножения этого числа.
- Напишите скрипт, который выводит числа от 1 до 10 с использованием цикла
- Создание и использование пользовательских функций:
- Создайте функцию
greet
, которая принимает имя в качестве аргумента и выводит приветствие. - Вызовите функцию
greet
с вашим именем.
- Создайте функцию
- Использование команд для работы с файлами:
- Создайте текстовый файл
example.txt
. - Запишите в него строку “Пример текста”.
- Используйте команду
cat
для чтения содержимого файлаexample.txt
.
- Создайте текстовый файл
Контрольные вопросы
- Основы работы с командной строкой:
- Какие команды используются для навигации по файловой системе в Shell?
- Как узнать текущий рабочий каталог в командной строке?
- Какие команды используются для управления файлами и каталогами?
- Перенаправление ввода/вывода и конвейеры:
- Какие символы используются для перенаправления вывода команды в файл?
- Чем отличаются символы
>
и>>
при перенаправлении вывода? - Что такое конвейер (pipe) в Shell, и как он используется?
- Написание скриптов на Shell:
- Как объявить переменную в Shell скрипте?
- Как передать аргументы в скрипт при его вызове?
- Какие операторы управления используются в Shell скриптах, и как они работают?
- Управление процессами:
- Как узнать список запущенных процессов в системе?
- Как отправить сигнал процессу для его завершения?
- Как перевести процесс в фоновый режим или вернуть его в передний план?
- Безопасность и права доступа:
- Как изменить права доступа к файлу или каталогу в Shell?
- Как изменить владельца и группу файла или каталога?
- Какие команды используются для работы с пользователями и группами в Unix/Linux?
- Практические навыки:
- Как написать скрипт, который будет искать все файлы в заданном каталоге с расширением “.txt” и выводить их список?
- Как создать скрипт, который будет резервировать копию заданного каталога и его содержимого?
- Как можно использовать командный интерпретатор для автоматизации рутинных задач на вашем компьютере?