Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Дисциплина:
«Операционные системы»
Преподаватель:
Алексеев Кирилл Анатольевич
учебный год 2020/2021
online.mirea.ru
Тема 2
Оболочки операционных систем
Занятие 2.7
лекция
НАПИСАНИЕ СЦЕНАРИЕВ КОМАНДНОЙ
ОБОЛОЧКИ BASH
online.mirea.ru
НАПИСАНИЕ СЦЕНАРИЕВ КОМАНДНОЙ ОБОЛОЧКИ
BASH
Учебные вопросы:
1) Общие сведения о сценариях командной оболочки bash.
2) Управляющая конструкция if-then.
3) Сравнение чисел и строк.
4) Проверки файлов.
5) Организация циклов в bash.
1)потоками
Литература
Основная:
1) Купер Мендель. Искусство программирования на языке сценариев командной
оболочки.
2) Bash Reference Manual (http://www.gnu.org/software/bash/manual/bash.html)
Дополнительная:
1) Справочные страницы ОС GNU/Linux (man <имя команды>)
online.mirea.ru
1. Общие сведения о сценариях командной оболочки
bash
Командная оболочка (интерпретатор командной строки, command line shell,command-line
interpreter) – программа, считывающая строки из терминала, текстового файла и других
источников и интерпретирующая их в качестве команд некоторой системы.
Режимы исполнения команд:
• интерактивный
• пакетный.
pwd ; whoami
Используя подобный подход, вы можете совмещать сколько угодно команд в
одной строке, ограничение – лишь в максимальном количестве аргументов,
которое можно передать программе. Определить это ограничение можно с
помощью команды:
getconf ARG_MAX
online.mirea.ru
1. Общие сведения о сценариях командной оболочки
bash
Особенности запуска сценария командной оболочки
1) Первая строка файла – указание интерпретатора содержимого запускаемого файла:
#!/bin/bash
2) Стандартное расширение файла: .sh
3) Следует устанавливать права доступа «на исполнение» к файлу:
сhmod +x my_script.sh
Попытка запуска файла сценария с неправильно настроенными разрешениями
online.mirea.ru
Успешный запуск bash-скрипта
2. Управляющая конструкция if-then
В некоторых сценариях требуется управлять потоком исполнения команд.
Например, если некое значение больше пяти, нужно выполнить одно действие, в
противном случае – другое. Подобное применимо в очень многих ситуациях, и здесь
нам поможет управляющая конструкция if-then. В наиболее простом виде она выглядит
так:
if команда
then
команды
fi
#!/bin/bash
if pwd
then
echo "It works"
fi
Поиск пользователя
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user
Exists"
fi
online.mirea.ru
Управляющая конструкция if-then-else
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi
Запуск скрипта с конструкцией if-then-else
online.mirea.ru
Управляющая конструкция if-then-else
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi
Пример скрипта с конструкцией if-then с дополнительным условием
online.mirea.ru
3. Сравнение чисел и строк
В скриптах можно сравнивать числовые значения:
n1 -eq n2 Возвращает истинное значение, если n1 равно n2.
n1 -ge n2 Возвращает истинное значение, если n1 больше или
равно n2.
n1 -gt n2 Возвращает истинное значение, если n1 больше n2.
n1 -le n2 Возвращает истинное значение, если n1 меньше или
равно n2.
n1 -lt n2 Возвращает истинное значение, если n1 меньше n2.
n1 -ne n2 Возвращает истинное значение, если n1 не равно n2.
online.mirea.ru
Сравнение чисел
#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $value1 is greater than 5"
else
echo "The test value $value1 is not greater than 5"
fi
Сравнение чисел в скриптах
online.mirea.ru
Сравнение строк
В сценариях можно сравнивать строковые значения:
str1 = str2 Проверяет строки на равенство, возвращает истину,
если строки идентичны.
str1 != str2 Возвращает истину, если строки не идентичны.
str1 < str2 Возвращает истину, если str1 меньше, чем str2.
str1 > str2 Возвращает истину, если str1 больше, чем str2.
-n str1 Возвращает истину, если длина str1 больше нуля.
-z str1 Возвращает истину, если длина str1 равна нулю.
Операторы «>» и «<» необходимо экранировать с помощью обратной косой
черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и
не появится. Скрипт интерпретирует знак «>» как команду перенаправления
вывода.
online.mirea.ru
Сравнение строк
#!/bin/bash
user="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in
user"
fi
Сравнение строк в скриптах
online.mirea.ru
Сравнение строк (пример 2)
#!/bin/bash
val1=text
val2="another text"
if [ $val1 \> "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
Сравнение строк
online.mirea.ru
4. Проверки файлов
Нижеприведённые команды используются в bash-скриптах чаще всего. Они
позволяют проверять различные условия, касающиеся файлов. Вот список этих
команд:
-d file Проверяет, существует ли файл, и является ли он директорией.
-e file Проверяет, существует ли файл.
-f file Проверяет, существует ли файл, и является ли он файлом.
-r file Проверяет, существует ли файл, и доступен ли он для чтения.
-s file Проверяет, существует ли файл, и не является ли он пустым.
-w file Проверяет, существует ли файл, и доступен ли он для записи.
-x file Проверяет, существует ли файл, и является ли он исполняемым.
file1 -nt file2 Проверяет, новее ли file1, чем file2.
file1 -ot file2 Проверяет, старше ли file1, чем file2.
-O file Проверяет, существует ли файл, и является ли его владельцем текущий
пользователь.
-G file Проверяет, существует ли файл, и соответствует ли его идентификатор группы
идентификатору группы текущего пользователя.
online.mirea.ru
4. Проверки файлов
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $mydir
ls
else
echo "The $mydir directory does not exist"
fi
Вывод содержимого директории
online.mirea.ru
5. Организация циклов в bash
Циклы for
Оболочка bash поддерживает циклы for, которые позволяют организовывать перебор
последовательностей значений.
Базовая структура таких циклов:
for var in list
do
команды
done
#!/bin/bash
for var in first second third fourth fifth
do
echo "The $var item"
done
Простой цикл for
online.mirea.ru
Циклы for в bash
Перебор сложных значений
В списке, использованном при инициализации цикла for, могут содержаться не только
простые строки, состоящие из одного слова, но и целые фразы, в которые входят
несколько слов и знаков препинания.
#!/bin/bash
for var in first "the second" "the third"
"I’ll do it"
do
echo "This is: $var"
done
Перебор сложных значений
online.mirea.ru
Инициализация цикла списком, полученным из
результатов работы команды
Ещё один способ инициализации цикла for заключается в передаче ему списка,
который является результатом работы некоей команды. Тут используется подстановка
команд для их исполнения и получения результатов их работы.
#!/bin/bash
file="myfile"
for var in $(cat $file)
do
echo " $var"
done
Цикл, который перебирает содержимое файла
online.mirea.ru
Разделители полей в bash
Оболочка bash считает разделителями полей следующие символы:
● Пробел
● Знак табуляции
● Знак перевода строки
Если bash встречает в данных любой из этих символов, он считает, что перед
ним – следующее самостоятельное значение списка.
Разделители полей указываются в переменной окружения, которая называется
IFS (Internal Field Separator).
Можно временно изменить переменную среды IFS.
Например, если необходимо установить в качестве разделителя полей только
перевод строки, следует в сценарии указать:
IFS=$'\n'
online.mirea.ru
Построчный обход содержимого файла в цикле for
Ещё один способ инициализации цикла for заключается в передаче ему списка,
который является результатом работы некоей команды. Тут используется подстановка
команд для их исполнения и получения результатов их работы.
#!/bin/bash
file="/etc/passwd"
IFS=$'\n'
for var in $(cat $file)
do
echo " $var"
done
Построчный обход содержимого файла в цикле for
online.mirea.ru
Обход файлов, содержащихся в директории
Один из самых распространённых вариантов использования циклов for в bashскриптах заключается в обходе файлов, находящихся в некоей директории, и в
обработке этих файлов.
#!/bin/bash
for file in /home/likegeeks/*
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif [ -f "$file" ]
then
echo "$file is a file"
fi
done
Вывод содержимого папки
online.mirea.ru