Мендель Купер - Искусство программирования на языке сценариев командной оболочки
- Название:Искусство программирования на языке сценариев командной оболочки
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Мендель Купер - Искусство программирования на языке сценариев командной оболочки краткое содержание
Данное руководство не предполагает наличие у читателя познаний в области программирования на языке сценариев, однако, быстро восполняет этот недостаток, постепенно, шаг за шагом раскрывая мудрость и красоту UNIX. Это руководство может рассматриваться как учебник, предназначенный для самостоятельного изучения или как справочник по программированию на shell. Руководство снабжено серией хорошо прокомментированных примеров, поскольку лучший путь к изучению языка сценариев -- это написание сценариев.
Искусство программирования на языке сценариев командной оболочки - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
В общем случае, diffиспользуется для генерации файла различий, который используется как аргумент команды patch. Ключ -e отвечает за вывод файла различий в формате, пригодном для использования с edили ex.
patch: гибкая утилита для "наложения заплат". С помощью файла различий, сгенерированного утилитой diff, утилита patchможет использоваться для обновления устаревших версий файлов. Это позволяет распространять относительно небольшие "diff"-файлы вместо целых пакетов. Распространение "заплат" к ядру стало наиболее предпочтительным методом распространения более новых версий ядра Linux.
patch -p1
# Применит все изменения из 'patch-file'
# к файлам, описанным там же.
# Так выполняется обновление пакетов до более высоких версий.
Наложение "заплат" на ядро:
cd /usr/src
gzip -cd patchXX.gz | patch -p0
# Обновление исходных текстов ядра с помощью 'patch'.
# Пример взят из файла "README",
# автор не известен (Alan Cox?).
Кроме того, утилита diffв состоянии выполнять рекурсивный обход каталогов.
bash$ diff -r ~/notes1 ~/notes2
Only in /home/bozo/notes1: file02
Only in /home/bozo/notes1: file03
Only in /home/bozo/notes2: file04
Утилита zdiffсравнивает сжатые, с помощью gzip , файлы.
diff3
Расширенная версия diff, которая сравнивает сразу 3 файла. В случае успеха возвращает 0, но, к сожалению, не дает никакой информации о результатах сравнения.
bash$ diff3 file-1 file-2 file-3
====
1:1c
This is line 1 of "file-1".
2:1c
This is line 1 of "file-2".
3:1c
This is line 1 of "file-3"
sdiff
Сравнение и/или редактирование двух файлов перед объединением их в один файл. Это интерактивная утилита, по своей природе, и из-за этого она довольно редко используется в сценариях.
cmp
Утилита cmp-- это упрощенная версия diff. В то время, как diffвыводит подробную информацию об имеющихся различиях, утилита cmpлишь показывет номер строки и позицию в строке, где было встречено различие.
Подобно команде diff, команда cmpвозвращает код завершения 0, если файлы идентичны и 1, если они различны. Это позволяет использовать команду cmpв условных операторах.
Пример 12-27. Пример сравнения двух файлов с помощью cmp.
#!/bin/bash
ARGS=2 # Ожидаются два аргумента командной строки.
E_BADARGS=65
E_UNREADABLE=66
if [ $# -ne "$ARGS" ]
then
echo "Порядок использования: `basename $0` file1 file2"
exit $E_BADARGS
fi
if [[ ! -r "$1" || ! -r "$2" ]]
then
echo "Оба файла должны существовать и должны быть доступны для чтения."
exit $E_UNREADABLE
fi
cmp $1 $2 &> /dev/null # /dev/null -- "похоронит" вывод от команды "cmp".
# cmp -s $1 $2 даст тот же результат ("-s" -- флаг "тишины" для "cmp")
# Спасибо Anders Gustavsson за замечание.
#
# Также применимо к 'diff', т.е., diff $1 $2 &> /dev/null
if [ $? -eq 0 ] # Проверка кода возврата команды "cmp".
then
echo "Файл \"$1\" идентичен файлу \"$2\"."
else
echo "Файл \"$1\" отличается от файла \"$2\"."
fi
exit 0
Для работы с gzip файлами используется утилита zcmp.
comm
Универсальная утилита сравнения. Работает с отсортированными файлами.
comm -options first-file second-file
comm file-1 file-2-- вывод в три колонки:
колонка 1 = уникальные строки для file-1
колонка 2 = уникальные строки для file-2
колонка 3 = одинаковые строки.
Ключи, подавляющие вывод в одной или более колонках.
-1 -- подавление вывода в колонку 1
-2 -- подавление вывода в колонку 2
-3 -- подавление вывода в колонку 3
-12 -- подавление вывода в колонки 1 и 2 , и т.д.
Утилиты
basename
Выводит только название файла, без каталога размещения. Конструкция basename $0-- позволяет сценарию узнать свое имя, то есть имя файла, который был запущен. Это имя может быть использовано для вывода сообщений, напрмиер:
echo "Порядок использования: `basename $0` arg1 arg2 ... argn"
dirname
Отсекает basenameот полного имени файла и выводит только путь к файлу.
Утилитам basenameи dirnameможет быть передана любая строка, в качестве аргумента. Этот аргумент необязательно должен быть именем существующего файла (см. Пример A-8).
Пример 12-28. Утилиты basename и dirname
#!/bin/bash
a=/home/bozo/daily-journal.txt
echo "Basename для /home/bozo/daily-journal.txt = `basename $a`"
echo "Dirname для /home/bozo/daily-journal.txt = `dirname $a`"
echo
echo "Мой домашний каталог `basename ~/`." # Можно указать просто ~.
echo "Каталог моего домашнего каталога `dirname ~/`." # Можно указать просто ~.
exit 0
split
Утилита разбивает файл на несколько частей. Обычно используется для разбиения больших файлов, чтобы их можно было записать на дискеты или передать по электронной почте по частям.
sum, cksum, md5sum
Эти утилиты предназначены для вычисления контрольных сумм. Контрольная сумма -- это некоторое число, вычисляемое исходя из содержимого файла, и служит для контроля целостности информации в файле. Сценарий может выполнять проверку контрольных сумм для того, чтобы убедиться, что файл не был изменен или поврежден. Для большей безопасности, рекомендуется использовать 128-битную сумму, генерируемую утилитой md5sum( message digest check sum).
bash$ cksum /boot/vmlinuz
1670054224 804083 /boot/vmlinuz
bash$ md5sum /boot/vmlinuz
0f43eccea8f09e0a0b2b5cf1dcf333ba /boot/vmlinuz
Обратите внимание: утилита cksumвыводит контрольную сумму и размер файла в байтах.
Пример 12-29. Проверка целостности файла
#!/bin/bash
# file-integrity.sh: Проверка целостности файлов в заданном каталоге
E_DIR_NOMATCH=70
E_BAD_DBFILE=71
dbfile=File_record.md5
# Файл для хранения контрольных сумм.
set_up_database ()
{
echo ""$directory"" > "$dbfile"
# Записать название каталога в первую строку файла.
md5sum "$directory"/* >> "$dbfile"
# Записать контрольные суммы md5 и имена файлов.
}
check_database ()
{
local n=0
local filename
local checksum
# ------------------------------------------- #
# Возможно эта проверка и не нужна,
#+ но лучше перестраховаться сейчас, чем жалеть об этом потом.
Читать дальшеИнтервал:
Закладка: