Главная страница
Навигация по странице:

  • Команда break Команда break используется для выхода из циклов for, while и until до того, как будет удовлетворено управляющее условие. Пример 13

  • Команды echo и printf При использовании команды echo

  • Выполнение команд и получение результатов их выполнения

  • ЛАБОРАТОРНЫЕ РАБОТЫ ОС (Для допуска необходимо сделать 1 или 6 л. Практикум по дисциплине Операционные системы (ОС). Цели лабораторных занятий это формирование у будущих бакалавров направлений подготовки 09. 03. 01


    Скачать 2.71 Mb.
    НазваниеПрактикум по дисциплине Операционные системы (ОС). Цели лабораторных занятий это формирование у будущих бакалавров направлений подготовки 09. 03. 01
    Дата15.10.2022
    Размер2.71 Mb.
    Формат файлаpdf
    Имя файлаЛАБОРАТОРНЫЕ РАБОТЫ ОС (Для допуска необходимо сделать 1 или 6 л.pdf
    ТипПрактикум
    #735270
    страница21 из 21
    1   ...   13   14   15   16   17   18   19   20   21
    Цикл until
    У цикла until следующая синтаксическая запись: until условие do операторы done
    Запись очень похожа на синтаксическую запись цикла while, но с обратным проверяемым условием. Другими словами, цикл продолжает выполняться, пока условие не станет истинным (true).
    Пример 11: Вычисление суммы целых чисел, вводимых с клавиатуры.
    Признак окончания ввода – число 0.
    #!/bin/sh sum=0 read num until [ $num –eq 0 ]; do sum=$((sum+num)) read num done echo $sum exit 0
    Как правило, если нужно выполнить цикл хотя бы один раз,

    203 применяют цикл while; если такой необходимости нет, используют цикл until.
    Функции
    В командной оболочке можно определять функции, используемые для структурирования кода. Как альтернативу можно использовать разбиение большого сценария на много маленьких, каждый из которых выполняет небольшую задачу. У этого подхода есть несколько недостатков: выполнение вложенного в сценарий другого сценария будет гораздо медленнее, чем выполнение функции и значительно труднее возвращать результаты.
    Для определения функции в командной оболочке просто введите ее имя и следом за ним пустые круглые скобки, а операторы тела функции заключите в фигурные скобки.
    Имя_функции ()
    { операторы
    }
    Пример 12. Простая функция
    Начнем с действительно простой функции.
    #!/bin/sh foo () { echo "Function foo is executing"
    } echo "script starting" foo echo "script ended" exit 0
    Cценарий выведет на экран следующий текст: script starting
    Function foo is executing script ended
    Данный сценарий начинает выполняться с первой строки. Когда он находит конструкцию foo () {, он знает, что здесь дается определение функции, названной foo. Он запоминает ссылку на функцию и foo продолжает выполнение после обнаружения скобки }. Когда выполняется строка с единственным именем foo, командная оболочка знает, что нужно выполнить предварительно определенную функцию. Когда функция завершится, выполнение сценария продолжится в строке, следующей за вызовом функции foo.
    Всегда необходимо определить функцию прежде, чем ее запускать, что похоже на стиль, принятый в языке программирования Pascal, когда

    204 вызову функции предшествует ее определение, за исключением того, что в командной оболочке нет опережающего объявления (forward) функции.
    Это ограничение не создает проблем, потому что все сценарии выполняются с первой строки, поэтому если просто поместить все определения функций перед первым вызовом любой функции, все функции окажутся определенными до того, как будут вызваны.
    Когда функция вызывается, позиционные параметры сценария $*,
    $#, $1, $2 и т. д. заменяются параметрами функции. Именно так считываются параметры, передаваемые функции. Когда функция завершится, они восстановят свои прежние значения.
    Функция возвращает числовые значения с помощью команды return.
    Обычный способ возврата функцией строковых значений — сохранение строки в переменной, которую можно использовать после завершения функции. Другой способ — вывести строку с помощью команды echo и перехватить результат, как показано далее. foo () { echo JAY;}
    … result="$(foo)"
    В функциях командной оболочки можно объявлять локальные переменные с помощью ключевого слова local. В этом случае переменная действительна только в пределах функции. В других случаях функция может обращаться к переменным командной оболочки, у которых глобальная область действия. Если у локальной переменной то же имя, что и у глобальной, в пределах функции локальная переменная перекрывает глобальную. Для того чтобы убедиться в этом на практике, можно выполнить следующий сценарий.
    #!/bin/sh sample_text="global variable" foo () { local sample_text="local variable" echo "Function foo is executing" echo $sample_text
    } echo "script starting" echo $sample_text foo echo "script ended" echo $sample_text exit 0
    При отсутствии команды return, задающей возвращаемое значение, функция возвращает статус завершения последней выполненной команды.
    В следующем сценарии, my_name, показано, как в функцию передаются, параметры и как функции могут вернуть логический результат

    205 true или false. Этот сценарий можно вызвать с параметром, задающим имя, которое необходимо использовать в вопросе.
    1.После заголовка командной оболочки определите функцию yes_or_no
    #!/bin/sh yes_or_no () { echo "Is your name $* ? " while true do echo -n "Enter yes or no: " read x case "$x" in у | yes ) return 0;; n | no ) return 1 ;;
    * ) echo "Answer yes or no" esac done
    }
    2. Далее начинается основная часть программы. echo "Original parameters are $*" if yes_or_no "$1" then echo "Hi $1, nice name" else echo "Never mind" fi exit 0
    Типичный вывод этого сценария может выглядеть следующим образом:
    $ ./mу_nаmе Rick Neil
    Original parameters are Rick Neil
    Is your name Rick ?
    Enter yes or no: yes
    Hi Rick, nice name
    $
    Как работает сценарий
    Когда сценарий начинает выполняться, функция определена, но еще не выполняется. В операторе if сценарий вызывает функцию yes_or_nо, передавая ей оставшуюся часть строки как параметры после замены $1 первым параметром исходного сценария строкой Rick. Функция использует эти параметры, в данный момент хранящиеся в позиционных параметрах $1, $2 и т. д., и возвращает значение в вызывающую программу. В зависимости от возвращенного функцией значения

    206 конструкция if выполняет один из операторов.
    Команды
    В сценариях командной оболочки можно выполнять два сорта команд. Как уже упоминалось, существуют "обычные" команды, которые могут выполняться и из командной строки (называемые внешними командами), и встроенные команды (называемые внутренними командами). Внутренние команды реализованы внутри оболочки и не могут вызываться как внешние программы. Но большинство внутренних команд представлено и в виде автономных программ, это условие - часть требований стандарта POSIX. Обычно не важно, команда внешняя или внутренняя, за исключением того, что внутренние команды выполняются быстрее.
    В этом разделе представлены основные команды, как внутренние, так и внешние, которые используются при написании сценариев.
    Команда break
    Команда break используется для выхода из циклов for, while и until до того, как будет удовлетворено управляющее условие.
    Пример 13:
    #!/bin/sh rm -rf fred* echo > fred1 echo > fred2 mkdir fred3 echo > fred4 for file in fred* do if [ -d "$file" ]; then break; fi done echo first directory starting fred was $file rm -rf fred* exit 0
    Команда continue
    Как и одноименный оператор языка С, эта команда заставляет охватывающий ее цикл for, while нли until начать новый проход или следующую итерацию. При этом переменная цикла принимает следующее значение в списке.
    Пример 14:
    #!/bin/sh rm -rf fred*

    207 echo > fred1 echo > fred2 mkdir fred3 echo > fred4 for file in fred* do if [ -d "$file" ]; then echo "skipping directory $file" continue fi echo file is $file done rm -rf fred* exit 0
    Команда continue может принимать в качестве необязательного параметра номер прохода охватывающего цикла, с которого следует возобновить выполнение цикла.
    Таким образом, можно иногда выскочить из вложенных циклов.
    Данный параметр редко применяется, т. к. он часто сильно затрудняет понимание сценариев. Например, for х in 1 2 3 do echo before $x continue 1 echo after $x done
    У приведенного фрагмента будет следующий вывод: before 1 before 2 before 3
    Команды echo и printf
    При использовании команды echo возникает общая проблема - удаление символа перехода на новую строку. В ОС Linux общепринятый метод - echo -n "string to output"
    printf
    Команда printf есть только в современных командных оболочках.
    Группа Х/Ореп полагает, что ее следует применять вместо команды echo для генерации форматированного вывода. У команды printf следующая синтаксическая запись. printf "строка формата" параметр1 параметр2 ...
    Строка формата очень похожа с некоторыми ограничениями на применяемую в языках программирования С и C++. Главным образом не

    208 поддерживаются числа с плавающей точкой, поскольку все арифметические операции в командной оболочке выполняются над целыми числами. Строка формата состоит из произвольной комбинации литеральных символов, escape-последовательностей и спецификаторов преобразования. Все символы строки формата, отличающиеся от \ и %, отображаются на экране при выводе.
    В (табл.3) приведены поддерживаемые командой escape- последовательности.
    Таблица 3.
    Некоторые escape-последовательности
    Escape- последовательность
    Описание
    \"
    Двойная кавычка
    \\
    Символ обратный слэш
    \n
    Символ перехода на новую строку
    \r
    Возврат каретки
    \t
    Символ табуляции
    \v
    Символ вертикальной табуляции
    \ооо
    Один символ с восьмеричным значением ооо
    \хНН
    Один символ с шестнадцатеричным значением HH
    Спецификатор преобразования состоит из символа %, за которым следует символ преобразования. Основные варианты преобразований перечислены в (табл. 4).
    Таблица 4.
    Спецификаторы преобразования
    Символ преобразования
    Описание d
    Вывод десятичного числа c
    Вывод символа s
    Вывод строки
    %
    Вывод знака %
    Строка формата используется для интерпретации остальных параметров команды и вывода результата, как показано в следующем примере:
    $ printf "%s\n" hello hello
    $ printf "%s %d\t%s" "Hi There" 15 people
    Hi There 15 people
    Обратите внимание на то, что для превращения строки Hi There в

    209 единый параметр ее нужно заключить в кавычки ("").
    Команда return
    Команда return служит для возврата значений из функций, как уже упоминалось ранее при обсуждении функций. Команда принимает один числовой параметр, который становится доступен в сценарии, вызывающем функцию. Если параметр не задан, команда return по умолчанию возвращает код завершения последней команды.
    Команда shift
    Команда shift сдвигает все переменные-параметры на одну позицию назад, так что параметр $2 становится параметром $1, параметр $3 - $2 и т. д. Предыдущее значение параметра $1 отбрасывается, а значение параметра $0 остается неизменным. Если в вызове команды shift задан числовой параметр, параметры сдвигаются на указанное количество позиций. Остальные переменные $* и $# также изменяются в связи с новой расстановкой переменных-параметров.
    Команда shift часто полезна при поочередном просмотре параметров, переданных в сценарий, и если вашему сценарию требуется 10 и более параметров, вам понадобится команда shift для обращения к 10-му параметру и следующим за ним.
    Например, вы можете просмотреть все позиционные параметры:
    #!/bin/sh while [ "S1" != ""]; do echo "$1" shift done exit 0
    Команда stat
    Команда stat предназначена для получения информации об указанном файле и о свойствах файловой системы на носителе, на котором хранится указанный файл.
    Примеры использования команды:
    Команда stat res где res – имя файла, выводит на экран всю информацию о файле с именем res и о владельце этого файла.
    Команда stat –f res где res – имя файла, выводит на экран всю информацию о файловой системе на диске, на котором хранится файл с именем res.
    Для получения доступа к отдельным полям информации о файле или

    210 файловой системе к приведенным выше командам добавляется ключ –с и параметр, определяющий поле. Например, для получения размера файла в байтах должен быть указан ключ %s и команда stat записывается в виде stat res –c %s
    Список ключей команды stat можно получить с помощью команды stat --help
    Выполнение команд и получение результатов их выполнения
    При написании сценариев часто требуется перехватить результат выполнения команды для использования его в сценарии командной оболочки; т. е. выполнить команду и поместить ее вывод в переменную.
    Сделать это можно с помощью синтаксической конструкции $(команда).
    Результат выполнения конструкции $ (команда) — просто вывод команды. Имейте в виду, что это не статус возврата команды, а просто строковый вывод, показанный далее.
    #!/bin/sh echo The current directory is $PWD echo The current users are $(who) exit 0
    Поскольку текущий каталог — это переменная окружения командной оболочки, первая строка не нуждается в применении подстановки команды. Результат выполнения программы who, напротив, нуждается в ней, если он должен стать переменной в сценарии.
    Если вы хотите поместить результат в переменную, то можете просто присвоить его обычным образом whoisthere=$(who)
    Возможность поместить результат выполнения команды в переменную сценария - мощное средство, поскольку оно облегчает использование существующих команд в сценариях и перехват результата их выполнения. Если необходимо преобразовать набор параметров, представляющих собой вывод команды на стандартное устройство вывода, и передать их как аргументы в программу, команда xargs сможет это сделать.
    Встроенные документы
    Особый способ передачи из сценария командной оьолочки входных данных команде – использование встроенного документа. Такой документ позволяет команде выполняться так, как будто она читает данные из файла или с клавиатуты, в то время как на самом деле она получает их из сценария.
    Встроенный документ начинается со служебных символов <<, за которыми следует специальная символьная последовательность, повторяющаяся и в конце документа. Символы << обозначают в командной оболочке перенаправление данных, которое в данном случае

    211 заставляет вход команды превратиться во встроенный документ.
    Специальная последовательность символов действует как маркер, указывая оболочке, где завершается встроенный документ. Маркерная последовательность не должна включаться в строки, передаваемые команде.
    Пример 15: Применение встроенного документа
    #!/bin/sh cat <
    Это пример встроенного документа для описания сценария
    !BUILTdoc!
    Пример 15 выводит на экран следующие строки
    Это пример встроенного документа для описания сценария
    Отладка сценариев
    При обноружении ошибки при выполнении сценария командная оболочка выводит на экран номер строки, содержащей ошибку. Если ошибка сразу не видна, нужно добавить несколько дополнительных команд echo для вывода значений переменных и протестировать фрагменты программного кода, вводя их в командной оболочке в интерактивном режиме. Основной способ отслеживания наиболее трудно выявляемых ошибок – использование отладочных опций командной оболочки. Отладочные опции командной строки приведены в (табл. 5).
    Таблица 5.
    Отладочные опции командной строки
    Опция
    Назначение sh –n
    <сценарий>
    Только проверяет синтаксические ошибки sh –v
    <сценарий>
    Выводит на экран команды перед их выполнением sh –x
    <сценарий>
    Выводит на экран команды после обработки командной строки sh –u
    <сценарий>
    Выдает сообщение об ошибке при использовании неопределенной переменной
    2 МЕТОДИКА ВЫПОЛНЕНИЯ
    1. Получить полный список ключей команды stat.
    2. Вычислить факториал целого числа, вводимого с клавиатуры.
    Предусмотреть проверку правильности ввода аргумента.
    3. Найти первые N чисел Фибоначчи, используя рекуррентное

    212 соотношение
    A
    i+1
    =A
    i
    +A
    i-1
    Значения первых двух чисел и необходимое количество чисел N ввести с клавиатуры.
    4. Написать и выполнить сценарии для решения индивидуальных задач, номер задачи определяется номером бригады:
    5. Найти суммарный объем выполняемых файлов в текущем каталоге.
    6. В текущем каталоге найти выполняемый файл наибольшего размера.
    7. Вывести имена файлов текущего каталога, начинающиеся на букву a или b, в которые можно записывать данные.
    8. В текущем каталоге найти имя файла, который был изменен позже всех. На экран вывести дату изменения и имя файла.
    9. Написать сценарий для проверки, имеются ли в двух подкаталогах, имена которых задаются первым и вторым параметрами сценария, файлы с одинаковыми именами. Количество файлов с одинаковыми именами и имена файлов вывести на экран.
    10. Для каждого подкаталога текущего каталога найти количество файлов. Вывести имена подкаталогов и количество файлов в этом каталоге.
    11. В текущем каталоге найти количество файлов, имеющих различные имена, но одинаковые размеры. Вывести на экран величину размера и имена файлов, имеющих данный размер.
    12. В текущем каталоге и его подкаталогах найти файлы, созданные в течение последней недели.
    Используя команду printf, написать сценарий для перевода введенного с клавиатуры целого положительного числа в восьмеричную и шестнадцатеричную системы счисления.
    3 ОТЧЕТ О РАБОТЕ
    Готовится в письменном виде один на бригаду. Содержание отчета:
    1. Результаты выполнения заданий 1- 3 – тексты сценариев и результаты их выполнения
    2. Результаты выполнения индивидуального задания для бригады - текст сценария и результаты его выполнения.
    4 КОНТРОЛЬНЫЕ ВОПРОСЫ
    1. Назначение, создание и выполнение сценариев.
    2. Использование кавычек в командной строке.
    3. Переменные в bash.
    4. Перенаправление ввода-вывода и каналы

    213 5. Превращение сценария в исполняемый файл
    6. Команда test или [
    7. Оператор разветвления if
    8. Проверка выполнения нескольких условий (выполнение нескольких команд)
    9. Оператор выбора case
    10. Операторы цикла
    11. Команды break и continue - назначение, примеры использования
    12. Команда printf – назначение, отличия от языка С, примеры использования
    13. Встроенные документы.
    14. Отладка сценариев

    214
    СПИСОК ЛИТЕРАТУРЫ
    1. Дейтел Х.М., Дейтел П.Дж., Чофнес Д.Р. Операционные системы. Том
    1. Основы и принципы. Третье изд. Изд. Бином - 2011. – 1024 с.
    2. Проскурин, В.Г. Защита в операционных системах : учеб. пособие для вузов [Электронный ресурс] / В.Г. Проскурин .— М. : Горячая линия –
    Телеком, 2014 .— 193 с.: ил. – ISBN 978-5-9912-0379-1. – Режим доступа: https://rucont.ru/efd/297852 – Загл. с экрана.
    3. Рихтер Д. и Назар К. Windows via C/C++. Программирование на языке
    Visual C++/ Пер. с англ. М.: Издательство «Русская редакция»; СПб.:
    Питер - 2008. – 896 с.
    4. Рихтер Дж. CLR via C#. Программирование на платформе Microsoft
    .NET Framework 4.0 на языке C#. 3-е изд. Питер, 2012.- 928 с.
    5. Роберт Лав. Ядро Linux: описание процесса разработки. И.Д. Вильямс. –
    2013. – 496 с.
    6. Родригес К.З., Фишер Г. Смолски С. Linux: азбука ядра. – 2007. – 584 с.
    7. Руссинович М. и Соломон Д. Внутреннее устройство Microsoft
    Windows: Windows Server 2003, Windows XP и Windows 2000. Мастер- класс./ Пер. с англ. СПб.: Питер, 2005. – 992 с.
    8. Собель М. Linux. Администрирование и системное программирование.
    Питер. 2011. – 880 с.
    9. Станек Уильям Р. PowerShell 2.0. Справочник администратора. СПб:
    БХВ-Петербург, 2010. – 416 с.
    10. William Stallings. Operatings Systems. Internals and Design Principles.
    Sevents Edition. - 2012. - 768 c.
    Федеральное государственное бюджетное образовательное учреждение высшего образования
    «Поволжский государственный университет телекоммуникаций и информатики»
    443010, г. Самара, ул. Льва Толстого, 23
    ________________________________________________________________
    Подписано в печать 17.05.17 г. Формат 60х84/16.
    Бумага офсетная № 1. Гарнитура Таймс.
    Заказ № 1007895. Печать оперативная. Усл. печ. л. 12.31 Тираж 100 экз.
    _________________________________________________________________
    Отпечатано в издательстве учебной и научно литературы
    Поволжского государственного университета телекоммуникаций и информатики
    443090, г. Самара, Московское шоссе, 77, т. (846) 228-00-44
    1   ...   13   14   15   16   17   18   19   20   21


    написать администратору сайта