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

При написании сценариев часто требуется перехватить результат выполнения команды для использования его в сценарии командной оболочки; т. е. выполнить команду и поместить ее вывод в переменную. Сделать это можно с помощью синтаксической конструкции $(команда).

Результат выполнения конструкции $ (команда) — просто вывод команды. Имейте в виду, что это не статус возврата команды, а просто строковый вывод, показанный далее.

#!/bin/sh

echo The current directory is $PWD

echo The current users are $(who)

exit 0

Поскольку текущий каталог — это переменная окружения командной оболочки, первая строка не нуждается в применении подстановки команды. Результат выпол­нения программы who, напротив, нуждается в ней, если он должен стать перемен­ной в сценарии.

Если вы хотите поместить результат в переменную, то можете просто присвоить его обычным образом whoisthere=$(who)

Возможность поместить результат выполнения команды в переменную сценария - мощное средство, поскольку оно облегчает использование существующих команд в сценариях и перехват результата их выполнения. Если необходимо преобразовать набор параметров, представляющих собой вывод команды на стандартное устройство вывода, и передать их как аргументы в про­грамму, команда xargs сможет это сделать.

Встроенные документы

Особый способ передачи из сценария командной оболочки входных данных команде – использование встроенного документа. Такой документ позволяет команде выполняться так, как будто она читает данные из файла или с клавиатуры, в то время как на самом деле она получает их из сценария.

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

Пример 17.Применение встроенного документа

#!/bin/sh

cat <<!BUILTdoc!

Это пример встроенного

документа для описания сценария

!BUILTdoc!

Пример 17 выводит на экран следующие строки

Это пример встроенного

документа для описания сценария

Отладка сценариев

При обнаружении ошибки при выполнении сценария командная оболочка выводит на экран номер строки, содержащей ошибку. Если ошибка сразу не видна, нужно добавить несколько дополнительных команд echo для вывода значений переменных и протестировать фрагменты программного кода, вводя их в командной оболочке в интерактивном режиме. Основной способ отслеживания наиболее трудно выявляемых ошибок – использование отладочных опций командной оболочки.

Отладочные опции командной строки приведены в табл. 5.

Таблица 5. Отладочные опции командной строки

Опция Назначение
sh –n <сценарий> Только проверяет синтаксические ошибки
sh –v <сценарий> Выводит на экран команды перед их выполнением
sh –x <сценарий> Выводит на экран команды после обработки командной строки
sh –u <сценарий> Выдает сообщение об ошибке при использовании неопределенной переменной

МЕТОДИКА ВЫПОЛНЕНИЯ

1. Получить полный список ключей команды stat.

2. Написать и выполнить сценарии для решения перечисленных задач.

· в каталоге, указанным первым параметром сценария, найти количество:

- подкаталогов;

-выполняемых файлов;

-файлов, доступных для чтения;

-файлов, доступных для записи.

· в каталоге, указанным первым параметром сценария, найти количество файлов, размер которых (в байтах) более значения, указанного вторым параметром сценария.

· вычисление факториала числа, указанного первым параметром сценария. Задачу решить двумя способами.

· используя имя файла, указанное первым параметром сценария, найти размеры свободного и занятого дискового пространства.

· в каталоге, указанным первым параметром сценария, найти имена файлов, содержащих слово «shell».

· найти первые N чисел Фибоначчи, используя рекуррентное соотношение

Ai+1=Ai+Ai-1

Значения первых двух чисел и необходимое количество чисел N ввести с клавиатуры.

Индивидуальные задания для бригад приведены в таблице 6

Таблица 6. Индивидуальные задания для бригад

№№ бригад Задание (на бригаду)
Найти суммарный объем исполняемых файлов в текущем каталоге
В текущем каталоге найти доступный для чтения и записи файл наибольшего размера
Вывести имена файлов текущего каталога, начинающихся на буквы a или b
В текущем каталоге найти имя файла, который был изменен позже всех
Написать сценарий для проверки, имеются ли в двух подкаталогах, имена которых задаются первым и вторым параметрами сценария, файлы с одинаковыми именами
Написать сценарий для проверки, имеются ли в двух подкаталогах, имена которых задаются первым и вторым параметрами сценария, файлы одинакового размера
В каталоге, имя которого задано первым параметром сценария, найти имена файлов, у которых имеется более одной жесткой ссылки
В каталоге, имя которого задано первым параметром сценария, найти количество подкаталогов, имена которых начинаются на символ, указанный вторым параметром сценария
Для введенного с клавиатуры целого числа вывести на экран список его делителей. Считать, что число не превышает 1000000. Операция нахождения остатка от деления числа a на число b обозначается %
Для каталога, имя которого задано первым параметром сценария, вывести список файлов в виде таблицы с указанием следующих значений: имя файла, номер inode, размер, тип файла, права доступа к файлу
В текущем каталоге и его подкаталогах найти файлы, созданные в течение последней недели.
Используя команду printf, написать сценарий для перевода введенного с клавиатуры целого положительного числа в восьмеричную и шестнадцатеричную системы счисления.
  1. Ответить на контрольные вопросы.
  2. Подготовить отчет по работе. Содержание отчета:

- тексты сценариев для выполнения заданий п.2 и индивидуального задания;

- результаты выполнения сценариев (скриншоты или текст – по выбору).

КОНТРОЛЬНЫЕ ВОПРОСЫ

Наши рекомендации