Книга: Искусство программирования на языке сценариев командной оболочки

Пример 3-4. Резервное архивирование всех файлов, которые были изменены в течение последних суток

Пример 3-4. Резервное архивирование всех файлов, которые были изменены в течение последних суток

#!/bin/bash

# Резервное архивирование (backup) всех файлов в текущем каталоге,

# которые были изменены в течение последних 24 часов

#+ в тарболл (tarball) (.tar.gz - файл).

BACKUPFILE=backup

archive=${1:-$BACKUPFILE}

# На случай, если имя архива в командной строке не задано,

#+ т.е. по-умолчанию имя архива -- "backup.tar.gz"

tar cvf - `find . -mtime -1 -type f -print` > $archive.tar

gzip $archive.tar

echo "Каталог $PWD заархивирован в файл "$archive.tar.gz"."

# Stephane Chazelas заметил, что вышеприведенный код будет "падать"

#+ если будет найдено слишком много файлов

#+ или если имена файлов будут содержать символы пробела.

# Им предложен альтернативный код:

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

# find . -mtime -1 -type f -print0 | xargs -0 tar rvf "$archive.tar"

# используется версия GNU утилиты "find".

# find . -mtime -1 -type f -exec tar rvf "$archive.tar" '{}' ;

# более универсальный вариант, хотя и более медленный,

# зато может использоваться в других версиях UNIX.

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

exit 0


Могут возникнуть конфликтные ситуации между опреатором перенаправления "-" и именами файлов, начинающимися с символа "-". Поэтому сценарий должен проверять имена файлов и предаварять их префиксом пути, например, ./-FILENAME, $PWD/-FILENAME или $PATHNAME/-FILENAME.

Если значение переменной начинается с символа "-", то это тоже может быть причиной появления ошибок.

var="-n"

echo $var

# В данном случае команда приобретет вид "echo -n" и ничего не выведет.

-

предыдущий рабочий каталог. [дефис] Команда cd - выполнит переход в предыдущий рабочий каталог, путь к которому хранится в переменной окружения $OLDPWD .


Не путайте оператор "-" (предыдущего рабочего каталога) с оператором "-" (переназначения). Еще раз напомню, что интерпретация символа "-" зависит от контекста, в котором он употребляется.

-

Минус. Знак минус в арифметических операциях.

=

Символ "равно". Оператор присваивания

a=28

echo $a # 28

В зависимости от контекста применения, символ "=" может выступать в качестве оператора сравнения.

+

Плюс. Оператор сложения в арифметических операциях.

В зависимости от контекста применения, символ + может выступать как оператор регулярного выражения.

+

Ключ (опция). Дополнительный флаг для ключей (опций) команд.

Отдельные внешние и встроенные команды используют символ "+" для разрешения некоторой опции, а символ "-" -- для запрещения.

%

модуль. Модуль (остаток от деления) -- арифметическая операция.

В зависимости от контекста применения, символ % может выступать в качестве шаблона.

~

домашний каталог. [тильда] Соответствует содержимому внутренней переменной $HOME. ~bozo -- домашний каталог пользователя bozo, а команда ls ~bozo выведет содержимое его домашнего каталога. ~/ -- это домашний каталог текущего пользователя, а команда ls ~/ выведет содержимое домашнего каталога текущего пользователя.

bash$ echo ~bozo

/home/bozo

bash$ echo ~

/home/bozo

bash$ echo ~/

/home/bozo/

bash$ echo ~:

/home/bozo:

bash$ echo ~nonexistent-user

~nonexistent-user

~+

текущий рабочий каталог. Соответствует содержимому внутренней переменной $PWD.

~-

предыдущий рабочий каталог. Соответствует содержимому внутренней переменной $OLDPWD.

^

начало-строки. В регулярных выражениях символ "^" задает начало строки текста.

Управляющий символ

изменяет поведение терминала или управляет выводом текста. Управляющий символ набирается с клавиатуры как комбинация CONTROL + <клавиша>.

? Ctl-C

Завершение выполнения процесса.

? Ctl-D

Выход из командного интерпретатора (log out) (аналог команды exit).

"EOF" (признак конца файла). Этот символ может выступать в качестве завершающего при вводе с stdin.

? Ctl-G

"BEL" (звуковой сигнал -- "звонок").

? Ctl-H

Backspace -- удаление предыдущего символа.

#!/bin/bash

# Вставка символа Ctl-H в строку.

a="^H^H" # Два символа Ctl-H (backspace).

echo "abcdef" # abcdef

echo -n "abcdef$a " # abcd f

# Пробел в конце ^ ^ двойной шаг назад.

echo -n "abcdef$a" # abcdef

# Пробела в конце нет backspace не работает (почему?).

# Результаты могут получиться совсем не те, что вы ожидаете.

echo; echo

? Ctl-J

Возврат каретки.

? Ctl-L

Перевод формата (очистка экрана (окна) терминала). Аналогична команде clear.

? Ctl-M

Перевод строки.

? Ctl-U

Стирание строки ввода.

? Ctl-Z

Приостановка процесса.

Пробельный символ

используется как разделитель команд или переменных. В качестве пробельного символа могут выступать -- собственно пробел (space), символ табуляции, символ перевода строки, символ возврата каретки или комбинация из вышеперечисленных символов. В некоторых случаях, таких как присваивание значений переменным, использование пробельных символов недопустимо.

Пустые строки никак не обрабатываются командным интерпретатором и могут свободно использоваться для визуального выделения отдельных блоков сценария.

$IFS -- переменная специального назначения. Содержит символы-разделители полей, используемые некоторыми командами. По-умолчанию -- пробельные символы.

Оглавление книги


Генерация: 1.154. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз