Операционная система Linux Лекция №6 Командная оболочка (shell, bash) является интерфейсом командной строки в Unix-подобных ОС, то есть выполняет команды, которые подает пользователь, или которые читаются с файлов. Файлы с командами оболочки называются сценариями (скриптами, программами) оболочки. Эти сценарии не компилируются, а интерпретируются оболочкой. Это означает, что оболочка считывает сценарий от начала до конца, строку за строкой, ища указанные там команды и выполняя их; в отличие от этого подхода, компилятор преобразует целую программу к виду, пригодному для выполнения машиной — потом файл с таким кодом можно использовать в сценарии оболочки. Сценарии оболочки очень широко применяются в Linux. Ими являются большинство конфигурационных файлов, как общесистемных, так и пользовательских, и многие прикладные программы. 2 Пошаговое создание скрипта 1. Запустить текстовый редактор gedit (Приложения ->Стандартные), сохранить новый пустой файл под именем script1.sh в каталоге с вашей фамилией. Затем набрать в нем следующие строки 2. #!/bin/bash (обязательная первая строка скрипта — путь к оболочке) 3. mkdir testdir cd testdir touch file1 file2 file3 ls -al тело скрипта (команды) 4.[student@debian~]$ chmod u+x script1 (бит выполнения) 5.[student@debian~]$ ./script1.sh (или bash script1.sh) (запуск скрипта) 3 Точка и слэш здесь заменяют абсолютный путь к файлу Комментарии в скрипте — все строки начинающиеся с # являются комментариями (кроме самой первой). Переменные разделяются на системные и пользовательские. Системные переменные определяются и хранятся в окружении родительской оболочки (переменные окружения). Имена этих переменных состоят из заглавных букв, и могут быть показаны командой "env" без аргументов, либо по отдельности командой "echo", например "echo $HOME". Примерами системных переменных являются PWD, HOME, USER. Пользовательские переменные – их имена не могут начинаться с цифр, вместо пробела используется знак подчеркивания - например "val_1". Присваивание значения с помощью знака = без пробелов val_1=123. Использовать или показать значение "val_1" можно с помощью знака $ Пример: [student@debian~]$ val_1=123 [student@debian~]$ echo "this is $val_1" [student@debian~]$ this is 123 4 Аргументы командной строки Это переменные, которые содержат аргументы выполняемого скрипта. Доступ к этим переменным может быть получен через имена $1, $2, ... $n, где $1 первый аргумент командной строки, $2 второй, и так далее. Аргументы располагаются после имени скрипта и разделены пробелами. Переменная $0 - это имя скрипта. Переменная $? - это код возврата, любое значение кроме 0 означает завершение программы с ошибкой. Пример: [student@debian~]$ ./script1.sh 100 (скрипту передается значение первого аргумента 100, которое может быть использовано в командах внутри скрипта, обращение к нему через имя $1) Ввод-вывод в скриптах Для ввода с клавиатуры используется команда ''read''. Эта команда считает значения набранные на клавиатуре, и присвоит каждое определенной переменной . read <имя_переменной> Для вывода используется команда ''echo''. echo <имя_переменной> 5 Арифметические операции ● ● ● В bash возможно вычисление только целочисленных выражений Переменные и оператор заключаются в квадратные скобки выражения начинающегося на знак $. Синтаксис: $[арифметические операции] например: ● echo $[12 * 10] ● echo $[5 / 2] ● echo $[7 % 4] ● n=$[$n+1] (увеличение счетчика на единицу) ● Или можно использовать написание $((...)) более независимо от типа командной оболочки. 6 Сравнение переменных В скриптах шелла можно выполнять различные сравнения. Если значения сравниваемых переменных являются числами, то надо использовать следующие опции: -eq Равно -ne Не равно -lt Меньше -le Меньше или равно -gt Больше -ge Больше или равно ● Если переменные являются строками, то надо использовать эти опции: = Равно != Не равно < Первая строка отсортирована перед второй > Первая строка отсортирована после второй ● 7 Оператор условия "if" Синтаксис: Обратите внимание на пробелы после if [ <условие> ] открывающей скобки и перед закрывающей скобкой then <любые выражения или операторы> fi Пример (script2.sh) #!/bin/bash echo "Login:" read username if [ "$username" = "student" ] then echo "Login correct" else echo "Bad login" fi 8 Пример меню на текстовой основе (script3.sh) #!/bin/bash OPTIONS="Hello Quit" select opt in $OPTIONS; do if [ "$opt" = "Hello" ]; then echo "Hello World" exit elif [ "$opt" = "Quit" ]; then echo "done" exit else clear echo "Bad option" fi done 9 Задание на практику 1. Набрать и запустить на выполнение скрипты со слайдов №3, 8, 9. 2. Написать скрипт, который имеет 2 аргумента командной строки, и выводит их значения в строках «first arg = __», «second arg = __», сравнивает их и выводит результат сравнения, а также строку «script name is __» и код возврата. 3. Модифицировать скрипт так, чтобы код возврата был отличен от 0. 4. Написать скрипт, который реализует меню на текстовой основе для работы с файлами. Скрипт запрашивает у пользователя имя файла, потом в зависимости от опции либо открывает этот файл на редактирование (команда gedit <имя файла>), либо копирует его в другую 10 директорию, либо удаляет.