Материал: 6261

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

71

Замечание

Ранее отмечено, что двойные и одинарные кавычки используются shell для экранирования последовательности слов, с целью рассмотрения этой последовательности как

отдельный аргумент.

Двойные кавычки разрешают подстановки ключевых и позиционных параметров.

Дополнительно, shell использует обратные кавычки: shell читает цепочки символов, заключенные в обратные кавычки, и интерпретирует их как команды.

Такие команды выполняются в месте их использования. Например,

abc=`ls -l`;

здесь — ключевому параметру abc будет присвоен результат выполнения команды ls -l — список имен файлов текущей директории. Результат работы данного примера приведен на рисунке 3.7.

Замечание

Такого же результата можно добиться командой:

abc=$(ls -l);

Рисунок 3.7 — Пример использования обратных кавычек

72

3.9 Сценарии

Простую команду или простой конвейер можно набрать и выполнить в окне консоли (терминала).

Сложные конструкции языка shell — программы — пишутся в файлах, которые называются сценариями.

Сценарий — последовательность простых команд и конвейеров, оформленных с помощью управляющих конструкций.

Язык shell содержит следующие управляющие конструкции.

for имя [in слово ...] do список

done

При каждой итерации переменная имя принимает следующее значение из набора in слово ....

Если конструкция in слово ... опущена, то список выполняется для каждого позиционного параметра.

case слово in

[шаблон [| шаблон] ...) список ;;]

...

esac

Выполняется список, соответствующий первому шаблону, успешно сопоставленному со словом. Формат шаблона тот же, что и используемый для генерации имен файлов, за исключением того, что в шаблоне не обязательно явно указывать символ /, начальную точку и их комбинацию:

элемент шаблона * может успешно сопоставляться и с ними.

if список_1 then список_2

[elif список_3 then список_4]

...

[else список_5] fi

Выполняется список_1 и если код его завершения 0, то выполняется список_2, иначе - список_3 и если код его завершения 0, то выполняется список_4 и т.д. Если же коды завершения всех списков, использованных в качестве условий, оказались ненулевыми, выполняется else-часть (список_5). Если else-часть отсутствует, и ни одна then-часть не выполнялась,

73 возвращается нулевой код завершения.

while список_1 do список_2

done

Пока код завершения последней команды списка_1 есть 0, выполняются команды списка_2. При замене служебного слова while на until, условие продолжения цикла меняется на противоположное. Если команды из списка_2, не выполнялись вообще, код завершения устанавливается равным нулю.

(список)

Группировка команд для выполнения их порожденным shell'ом.

{список;}

Группировка команд для выполнения их текущим shell'ом.

имя ( ) {список;}

Определение функции с заданным именем. Тело функции - список, заключенный между { и }.

Следующие слова трактуются языком shell как ключевые, если они являются первым словом команды и не экранированы:

if then elif else fi case in esac

for while until do done

{}

Изучив понятие сценария, закрепим предыдущий учебный материал двумя примерами, решающими задачи: чтение и подключение архива студента, а также запись архива на личный flashUSB.

Текст сценариев показан на рисунке 3.8 и листингах 3.1-3.2.

Рассмотрение примеров начнем со сценария экспорта параментров ПО УПК АСУ.

74

Рисунок 3.8 — Сценарий экспорта параметров ПО УПК АСУ

Листинг 3.1 — Сценарий mount-upk.sh — подключение архива студента

#!/bin/bash

###########################

#Специально для ОС УПК АСУ

#Reznik, 02.09.2016

#Подключение темы обучения

###########################

#Используем функцию для вывода сообщения и продолжения работы программы: if_msg()

{

echo -e "$@"

echo -en "Нажми клавишу$green Enter$gray для продолжения ... " read aa

}

#Используем функцию для вывода сообщения и выхода из программы:

if_exit()

75

{

 

 

echo -e

"$@"

 

echo -e

"-------------------------------------------------------

"

echo -en

"Нажми клавишу$green Enter$gray

для завершения работы программы ...

"

 

 

read aa

 

 

exit 0

 

 

}

 

 

#------------------------------------

 

 

# Подготовительная часть

 

#------------------------------------

 

 

. /etc/upkasu/upk.colors

 

echo -e "${green}Проверяем пользователя!$gray"

 

[ "$USER" != "upk" ] || \

 

if_exit "Ползователь upk не может устанавливать тему обучения!!!"

echo "Читаем парметры окружения..."

 

. /etc/upkasu/upkasu.conf

 

echo "Останавливаем все процессы пользователя upk, подключенные к директории /home/upk..."

for xx in $(sudo lsof -t /home/upk/); do [ -d "/proc/$xx" ] || continue

echo -e "Удаляю процесс$red $xx $gray" sudo kill -9 "$xx"

done

echo "Проверяем наличие монтирования к директории /home/upk ..." x1=$(mount | grep "/home/upk")

[ "x$x1" == "x" ] || sudo umount -f /home/upk

x1=$(mount | grep /home/upk | cut -d ' ' -f 1 )

[ "x$x1" == "x" ] || if_exit "${red}Не могу отмонтировать файл${gray}: $x1"

#------------------------------------

 

 

 

# Определяем устройства архива:

 

 

xdev=$(blkid -U "$ROOT_ARCH")

 

 

echo "Проверяем монтирование устройства архива..."

 

 

[ "x$xdev" !=

"x" ] || \

 

 

if_exit "${red}Подмонтируйте$gray устройство архива...

и попробуйте снова!.."

echo "Находим

директорию архива..."

 

 

xdir=$(mount | grep "$xdev" | cut -d ' ' -f 3 )

 

 

[ "x$xdir" !=

"x" ] || if_exit "${red}Не могу найти$gray директорию архива...

"

if [ "x$xdir"

== "x/" ]; then

 

 

xdir=""

 

 

 

fi

 

 

 

echo "Находим

директорию дистрибутива..."

 

 

wdir="${UPK_MOUNT}"

 

 

[ "x$wdir" != "x" ] || if_exit "${red}Не могу найти$gray директорию дистрибутива...

"

if [ "x$wdir" == "x/" ]; then wdir=""

fi

 

 

 

 

xdir="${xdir}/${UPK_PATH}/themes"

 

 

 

[ -d "$xdir"

] || if_exit "${red}Отсутствует$gray директория архива...

"

 

wdir="${wdir}/${UPK_PATH}/themes"

 

 

 

[ -d "$wdir"

] || if_exit "${red}Отсутствует$gray директория дистрибутива...

"

#------------------------------------

 

 

 

 

# Выбираем тему обучения

 

 

 

echo "Читаем

список доступных тем обучения...

"

 

 

[ "$xdir" ==

"$wdir" ] && fl=home.ext4fs || fl=home.ext4fs.gz

 

 

Источник: https://studfile.net/preview/16438529/