Лаб. работа "Язык командного энтерпритатора 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:
1#!/bin/bash
2
3# Комментарий: Начало скрипта
4
5# Объявление переменных
6VAR1="Hello"
7VAR2="World"
8
9# Основная часть скрипта
10echo "$VAR1 $VAR2" # Выводит "Hello World"
11
12# Завершение скрипта
13exit 0
Шебанг (Shebang):
#!/bin/bash- это строка в начале скрипта, указывающая на то, какой интерпретатор использовать. В данном случае используется интерпретатор Bash.Комментарии: Комментарии помогают описать, что делает скрипт. Они начинаются с символа
#и игнорируются интерпретатором.Объявление переменных: Здесь объявляются переменные
VAR1иVAR2, которые содержат строки “Hello” и “World” соответственно.Основная часть скрипта: Это место, где выполняются основные действия. В данном случае, скрипт просто выводит содержимое переменных с помощью команды
echo.Завершение скрипта: Команда
exit 0указывает на успешное завершение скрипта. Код0обычно означает успешное выполнение, а другие значения могут указывать на различные ошибки или условия завершения.
Переменные
Переменные в shell играют ключевую роль, позволяя хранить и использовать данные в скриптах.
Объявление переменных: Переменные объявляются без использования ключевых слов, просто путем присваивания значения. Например:
1VAR="value"Использование переменных: Для использования переменной в тексте скрипта нужно указать её имя, предваряя его символом доллара
$. Например:1echo $VARСпециальные переменные: В shell есть множество специальных переменных, таких как
$0,$1,$2, и т.д., которые хранят аргументы командной строки. Например:1echo "Имя этого скрипта: $0"Чтение значений из ввода: Можно использовать команду
read, чтобы прочитать значение из ввода и присвоить его переменной. Например:1read NAME 2echo "Привет, $NAME!"Удаление переменных: Для удаления переменной используется команда
unset. Например:1unset VARИнтерполяция переменных: Переменные могут быть интерполированы в строковых значениях. Например:
1GREETING="Hello" 2echo "$GREETING, world!"Переменные окружения: Все переменные, которые вы экспортируете из shell, становятся переменными окружения для любых запущенных подкоманд или программ. Например:
1export MY_VAR="value"Именованные переменные: В bash и других расширениях shell можно использовать ассоциативные массивы для хранения данных. Например:
1declare -A fruits 2fruits[apple]="red" 3fruits[banana]="yellow" 4echo "Apple is ${fruits[apple]}"
Специальные переменные
Специальные переменные в 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:
1if условие; then 2 команды_если_условие_истинно 3else 4 команды_если_условие_ложно 5fiПример:
1if [ $x -gt 10 ]; then 2 echo "x больше 10" 3else 4 echo "x не больше 10" 5fiif-then (без else):
1if условие; then 2 команды_если_условие_истинно 3fiПример:
1if [ -e $FILE ]; then 2 echo "$FILE существует" 3fiif-elif-else:
1if условие1; then 2 команды_если_условие1_истинно 3elif условие2; then 4 команды_если_условие2_истинно 5else 6 команды_если_все_условия_ложны 7fiПример:
1if [ $x -gt 10 ]; then 2 echo "x больше 10" 3elif [ $x -eq 10 ]; then 4 echo "x равно 10" 5else 6 echo "x меньше 10" 7ficase:
1case выражение in 2 паттерн1) 3 команды_если_паттерн1_соответствует 4 ;; 5 паттерн2) 6 команды_если_паттерн2_соответствует 7 ;; 8 *) 9 команды_если_нет_соответствия_ни_одному_паттерну 10 ;; 11esacПример:
1case $VAR in 2 "value1") 3 echo "Переменная равна value1" 4 ;; 5 "value2") 6 echo "Переменная равна value2" 7 ;; 8 *) 9 echo "Переменная не равна ни value1, ни value2" 10 ;; 11esac
Эти операторы ветвления позволяют создавать гибкие скрипты, которые могут выполнять различные действия в зависимости от условий, и обеспечивают управление потоком выполнения программы в shell.
Предикаты
В контексте программирования “предикат” обычно означает выражение, которое оценивается как истинное или ложное. В языках программирования, включая shell, предикаты используются в операторах ветвления (например, в операторах if, while, case и других) для принятия решений на основе условий.
Сравнение чисел:
-eq: равно-ne: не равно-gt: больше-lt: меньше-ge: больше или равно-le: меньше или равно
Например:
1if [ $x -gt 10 ]; then 2 echo "x больше 10" 3fiСравнение строк:
=: равно!=: не равно-z: пустая строка-n: не пустая строка
Например:
1if [ "$var" = "value" ]; then 2 echo "Переменная равна value" 3fiФайловые предикаты:
-e: файл существует-f: обычный файл-d: каталог-r: доступен для чтения-w: доступен для записи-x: доступен для выполнения
Например:
1if [ -e $FILE ]; then 2 echo "$FILE существует" 3fiЛогические операции:
-a: логическое “и”-o: логическое “или”!: логическое “не”
Например:
1if [ "$var" = "value1" -o "$var" = "value2" ]; then 2 echo "Переменная равна value1 или value2" 3fi
Эти предикаты позволяют создавать условия в операторах ветвления, которые позволяют программам принимать решения и выполнять различные действия на основе этих условий.
Операторы циклов
В shell скриптах часто используются циклы для повторения определенных действий определенное количество раз или до выполнения определенного условия.
Цикл while:
1while условие; do 2 команды 3doneНапример:
1counter=0 2while [ $counter -lt 10 ]; do 3 echo $counter 4 ((counter++)) 5doneЦикл until:
1until условие; do 2 команды 3doneНапример:
1counter=0 2until [ $counter -eq 10 ]; do 3 echo $counter 4 ((counter++)) 5doneЦикл for (для перебора элементов в списке):
1for переменная in список; do 2 команды 3doneНапример:
1for i in {1..5}; do 2 echo $i 3doneЦикл for (для перебора элементов в массиве или списке):
1for переменная in элемент1 элемент2 ... элементN; do 2 команды 3doneНапример:
1for color in red green blue; do 2 echo "Color: $color" 3doneЦикл select (для создания интерактивного меню):
1select переменная in список; do 2 команды 3doneНапример:
1select fruit in apple banana orange; do 2 echo "Вы выбрали: $fruit" 3 break 4done
Эти циклы могут использоваться для автоматизации повторяющихся задач, обработки данных, итерации по спискам и многих других вещей в shell скриптах.
Вызов сторонних программ
Вызов сторонних программ из shell скриптов - обычная практика, которая позволяет скриптам взаимодействовать с другими программами и выполнять различные задачи. Для вызова сторонней программы используются команды, которые могут быть исполнены внутри скрипта.
Вызов программы по её имени:
1программа_или_команда аргументыНапример:
1ls -lИспользование переменных в качестве аргументов:
1переменная="аргументы" 2программа_или_команда $переменнаяНапример:
1directory="/path/to/directory" 2ls $directoryПодстановка вывода другой команды:
1программа_или_команда $(другая_команда)Например:
1files_count=$(ls | wc -l) 2echo "В текущем каталоге $files_count файлов"Использование обратных кавычек для подстановки вывода команды (устаревший метод):
1программа_или_команда `другая_команда`Например:
1files_count=`ls | wc -l` 2echo "В текущем каталоге $files_count файлов"Пайплайны (|) для передачи вывода одной команды в качестве входных данных другой:
1команда1 | команда2Например:
1ls | grep ".txt"Перенаправление вывода (stdout и stderr):
1программа_или_команда > файл 2программа_или_команда >> файл (для добавления в конец файла)Например:
1ls > file_list.txtПеренаправление ввода:
1программа_или_команда < файлНапример:
1sort < unsorted_file.txt
Это основные способы вызова сторонних программ из shell скриптов. Они позволяют взаимодействовать со стандартными командами операционной системы, а также с любыми другими программами, доступными в вашей среде выполнения.
Математические вычисления
В shell скриптах можно выполнить математические вычисления несколькими способами.
Арифметическое выражение с помощью встроенной команды
let:1let "результат = выражение"Например:
1let "x = 10 + 5" 2echo $x # Выведет 15Арифметическое выражение с помощью двойных круглых скобок
((...)):1результат=$((выражение))Например:
1x=$((10 + 5)) 2echo $x # Выведет 15Использование команды
expr:1результат=$(expr выражение)Например:
1x=$(expr 10 + 5) 2echo $x # Выведет 15Использование конструкции
$((...)):1результат=$((выражение))Например:
1x=$((10 + 5)) 2echo $x # Выведет 15Использование встроенной команды
bcдля вычисления выражений с плавающей запятой:1результат=$(echo "выражение" | bc)Например:
1x=$(echo "10.5 * 3" | bc) 2echo $x # Выведет 31.5
Каждый из этих методов имеет свои особенности и подходит для разных типов вычислений. Например, let и ((...)) работают только с целыми числами, в то время как bc поддерживает вычисления с плавающей запятой.
Пользовательские функции
В shell скриптах вы можете определять пользовательские функции для организации и структурирования вашего кода. Вот пример определения и вызова пользовательской функции:
1# Определение функции
2function my_function {
3 echo "Привет, это моя пользовательская функция!"
4}
5
6# Вызов функции
7my_function
Этот пример определяет функцию с именем my_function, которая выводит приветственное сообщение. После определения функции она вызывается с помощью my_function.
Ниже приведены некоторые дополнительные концепции, которые могут быть полезны при работе с пользовательскими функциями:
Передача аргументов в функцию:
1function my_function { 2 echo "Привет, $1!" 3} 4 5my_function "Мир"Этот пример передает строку “Мир” в функцию
my_function, которая выводит “Привет, Мир!”.Возврат значений из функции:
1function add_numbers { 2 local result=$(( $1 + $2 )) 3 echo $result 4} 5 6sum=$(add_numbers 5 3) 7echo "Сумма: $sum"Этот пример определяет функцию
add_numbers, которая принимает два аргумента, складывает их и возвращает результат. Результат сохраняется в переменнойsum.Локальные переменные в функции:
1function my_function { 2 local name="John" 3 echo "Привет, $name!" 4} 5 6my_function 7echo "Имя: $name" # Это вызовет ошибку, потому что переменная name является локальной для функцииВ этом примере переменная
nameявляется локальной для функцииmy_functionи недоступна за её пределами.Рекурсивные функции:
1function factorial { 2 if [ $1 -le 1 ]; then 3 echo 1 4 else 5 local prev=$(factorial $(( $1 - 1 ))) 6 echo $(( $1 * $prev )) 7 fi 8} 9 10result=$(factorial 5) 11echo "Факториал 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” и выводить их список?
- Как создать скрипт, который будет резервировать копию заданного каталога и его содержимого?
- Как можно использовать командный интерпретатор для автоматизации рутинных задач на вашем компьютере?