Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Название:Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03029-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.
Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Running mogrify −resize 50 % tmp//0696cf00-660e-11e6-8d38-001c42daa3a7.jpg
-опущено-
Усовершенствование сценария
Часто бывает полезно иметь возможность указать имя файла внутри команды или использовать лексемы, подобные тем, что упоминались в описании сценария bulkrename (сценарий № 102 выше): специальные строки, динамически заменяемые во время выполнения фактическими значениями (например, %d можно было бы заменять текущей датой, или %t отметкой текущего времени). Реализация поддержки подобных специальных лексем в команде или в именах файлов стала бы ценным усовершенствованием сценария.
Другим полезным усовершенствованием было бы использование утилиты time для определения продолжительности обработки всех файлов. Вывод статистической информации о количестве обработанных файлов или файлов, ожидающих обработки, тоже мог бы пригодиться в случае выполнения массивных заданий.
№ 104. Определение фазы Луны
Если вы оборотень, ведьма или просто интересуетесь лунным календарем, вам наверняка пригодится полезная и познавательная возможность определять фазы Луны.
Вся сложность в том, что Луна совершает полный оборот вокруг Земли за 27,32 дня. И ее фаза фактически зависит от вашего местоположения на Земле. Однако эта зависимость невелика, так что фазы Луны можно определять только по заданной дате.
Но зачем разбираться со всеми этими сложностями, если в Интернете полно сайтов, которые вычисляют фазу Луны для любой даты в прошлом, в настоящем или в будущем? Для сценария в листинге Б.5 мы используем для этого тот же сайт, что использует Google: http://www.moongiant.com/.
Код
Листинг Б.5.Сценарий moonphase
··#!/bin/bash
··# moonphase — сообщает фазу Луны (в действительности процент
··#·· освещенности) на текущую или указанную дату.
··# Формат запроса к Moongiant.com:
··#·· http://www.moongiant.com/phase/MM/DD/YYYY
··# Если дата не указана, использовать текущую дату.
··if [$# −eq 0]; then
····thedate="today"
··else
····# Дата указана. Проверить правильность ее формата.
····mon="$(echo $1 | cut −d/ −f1)"
····day="$(echo $1 | cut −d/ −f2)"
····year="$(echo $1 | cut −d/ −f3)"
····if [-z "$year" −o — z "$day"]; then # Нулевая длина?
······echo "Error: valid date format is MM/DD/YYYY"
······exit 1
····fi
····thedate="$1" # Отсутствие проверки ошибок = опасность.
··fi
··url="http://www.moongiant.com/phase/$thedate"
··pattern="Illumination: "
··phase="$(curl −s "$url" | grep "$pattern" | tr ',' '\
··' | grep "$pattern" | sed 's/[^0–9]//g')"
··# Сайт возвращает ответ в формате: "Illumination: NN%\n<\/span>"
··if ["$thedate" = "today"]; then
····echo "Today the moon is ${phase}% illuminated."
··else
····echo "On $thedate the moon = ${phase}% illuminated."
··fi
··exit 0
Как это работает
По аналогии с другими сценариями, извлекающими информацию из веб-запросов, основу сценария moonphase составляет код конструирования URL запроса и извлечения требуемого ответа из потока данных в формате HTML.
Анализ сайта показал, что поддерживается два вида адресов URL: один определяет текущую дату и имеет вид «phase/today», а другой — дату в прошлом или в будущем в формате MM/DD/YYYY, например: «phase/08/03/2017».
Задайте дату в правильном формате, и вы получите фазу Луны в указанный день. Но мы не можем просто добавить дату к доменному имени сайта, не выполнив некоторые проверки. С этой целью сценарий разбивает ввод пользователя на три поля — месяц, день и год — и затем проверяет строковые значения дня и года на ненулевую длину . В сценарий можно было бы добавить еще несколько проверок на ошибки, о которых рассказывается в разделе «Усовершенствование сценария».
Самая хитрая часть любого сценария, извлекающего информацию из Интернета — правильное определение шаблона, позволяющего получить желаемые данные. В сценарии moonphase этот шаблон определяется в строке . Самой длинной и сложной строкой (
) сценарий получает страницу с сайта moongiant.com и затем, с помощью последовательности команд grep и sed, извлекает строку, соответствующую заданному шаблону.
После этого остается только вывести освещенности для текущей или для указанной даты с использованием заключительной инструкции if/then/else.
Запуск сценария
При вызове без аргумента сценарий moonphase выводит освещенности для текущей даты. Попробуйте указать любой день в прошлом или в будущем в формате MM/DD/YYYY, как показано в листинге Б.6.
Результаты
Листинг Б.6.Запуск сценария moonphase
$ moonphase 08/03/2121
On 08/03/2121 the moon = 74 % illuminated.
$ moonphase
Today the moon is 100 % illuminated.
$ moonphase 12/12/1941
On 12/12/1941 the moon = 43 % illuminated.
12 декабря 1941 года кинокомпания Universal выпустила на экраны кинотеатров классический фильм ужасов «The Wolf Man» («Человек-волк»). И в этот день Луна не была полной. Проверьте!
Усовершенствование сценария
С точки зрения внутренней реализации, сценарий можно было бы существенно усовершенствовать, добавив дополнительные проверки на ошибки или даже просто задействовав сценарий № 3 из главы 1, чтобы дать пользователям возможность вводить даты в разных форматах. Также инструкцию if/then/else в конце неплохо было бы заменить функцией, преобразующей значение процента освещенности в более общепринятые названия фаз луны, такие как «убывающая», «растущая» или номер четверти. На сайте NASA имеется веб-страница, которую можно использовать для определения разных фаз Луны: http://starchild.gsfc.nasa.gov/docs/StarChild/solar_system_level2/moonlight.html.
Примечания
1
Произносится как «ше-банг». — Примеч. пер.
2
Символы «EOF» должны находиться в начале строки, т. е. перед ними не должно быть пробелов. Это требование синтаксиса встроенных документов. В оригинале это правило нарушено. В данном листинге перед всеми строками добавлены 2 пробела, чтобы не нарушить отступы. Они к делу не относятся, и в данном случае считается, что метка EOF находится в начале строки, без отступа. — Примеч. пер .
3
Тема: Внимание: ashley превысил квоту
Читать дальшеИнтервал:
Закладка: