<Предыдущая | Содержание: | Следующая>
Здесь документы
Мы рассмотрели два разных метода вывода текста, оба с использованием эхо COM-
манд. Есть третий способ, называемый здесь документ or здесь сценарий. Документ здесь - это дополнительная форма перенаправления ввода-вывода, при которой мы встраиваем текст в наш сценарий и вводим его в стандартный ввод команды. Работает это так:
команду << знак
текст
знак
в котором команду это имя команды, которая принимает стандартный ввод и знак строка, используемая для обозначения конца встроенного текста. Мы изменим наш сценарий, чтобы использовать здесь документ:
#! / Bin / Баш
# Программа для вывода страницы с системной информацией
TITLE = "Отчет о системной информации для $ HOSTNAME" CURRENT_TIME = $ (date + "% x% r% Z")
TIMESTAMP = "Создано $ CURRENT_TIME, $ USER"
кошка << _EOF_
$ TITLE
$ TITLE
$ TIMESTAMP
_EOF_
#! / Bin / Баш
# Программа для вывода страницы с системной информацией
TITLE = "Отчет о системной информации для $ HOSTNAME" CURRENT_TIME = $ (date + "% x% r% Z")
TIMESTAMP = "Создано $ CURRENT_TIME, $ USER"
кошка << _EOF_
$ TITLE
$ TITLE
$ TIMESTAMP
_EOF_
Вместо того, чтобы использовать эхо, наш скрипт теперь использует кошка и здесь документ. Струна _EOF_ (что означает «Конец файла», общепринятое соглашение) был выбран в качестве токена и отмечает конец встроенного текста. Обратите внимание, что маркер должен отображаться отдельно и в строке не должно быть конечных пробелов.
Так в чем же преимущество использования здесь документа? Это в основном то же самое, что и эхо, за исключением того, что по умолчанию одинарные и двойные кавычки в этих документах теряют свое особое значение для оболочки. Вот пример командной строки:
[я @ linuxbox ~] $ foo = "какой-то текст"
[я @ linuxbox ~] $ кошка << _EOF_
> $ Foo
[я @ linuxbox ~] $ foo = "какой-то текст"
[я @ linuxbox ~] $ кошка << _EOF_
> $ Foo
> "$ foo"
> '$ foo'
> \ $ foo
> _EOF_ некоторый текст "некоторый текст" 'некоторый текст'
$ Foo
> "$ foo"
> '$ foo'
> \ $ foo
> _EOF_ некоторый текст "некоторый текст" 'некоторый текст'
$ Foo
Как видим, оболочка не обращает внимания на кавычки. Он рассматривает их как обычные персонажи. Это позволяет нам свободно вставлять кавычки в документ здесь. Это может оказаться полезным для нашей программы отчетов.
Здесь документы могут использоваться с любой командой, которая принимает стандартный ввод. В этом примере мы используем здесь документ для передачи серии команд в FTP программа, чтобы получить файл с удаленного FTP-сервера:
#! / Bin / Баш
# Скрипт для получения файла через FTP FTP_SERVER = ftp.nl.debian.org
FTP_PATH = / debian / dists / lenny / main / installer-i386 / current / images / cdrom REMOTE_FILE = debian-cd_info.tar.gz
ftp -n << _EOF_ открыть $ FTP_SERVER
анонимный пользователь я @ linuxbox cd $ FTP_PATH
хэш
получить $ REMOTE_FILE до свидания
_EOF_
ls -l $ REMOTE_FILE
#! / Bin / Баш
# Скрипт для получения файла через FTP FTP_SERVER = ftp.nl.debian.org
FTP_PATH = / debian / dists / lenny / main / installer-i386 / current / images / cdrom REMOTE_FILE = debian-cd_info.tar.gz
ftp -n << _EOF_ открыть $ FTP_SERVER
анонимный пользователь я @ linuxbox cd $ FTP_PATH
хэш
получить $ REMOTE_FILE до свидания
_EOF_
ls -l $ REMOTE_FILE
Если мы изменим оператор перенаправления с «<<» на «<< -», оболочка будет игнорировать начальные символы табуляции в данном документе. Это позволяет сделать здесь документ с отступом, что может улучшить читаемость:
#! / Bin / Баш
# Скрипт для получения файла через FTP FTP_SERVER = ftp.nl.debian.org
#! / Bin / Баш
# Скрипт для получения файла через FTP FTP_SERVER = ftp.nl.debian.org
FTP_PATH = / debian / dists / lenny / main / installer-i386 / current / images / cdrom REMOTE_FILE = debian-cd_info.tar.gz
ftp -n << - _EOF_ открыть $ FTP_SERVER
анонимный пользователь я @ linuxbox cd $ FTP_PATH
хэш
получить $ REMOTE_FILE до свидания
_EOF_
ls -l $ REMOTE_FILE
FTP_PATH = / debian / dists / lenny / main / installer-i386 / current / images / cdrom REMOTE_FILE = debian-cd_info.tar.gz
ftp -n << - _EOF_ открыть $ FTP_SERVER
анонимный пользователь я @ linuxbox cd $ FTP_PATH
хэш
получить $ REMOTE_FILE до свидания
_EOF_
ls -l $ REMOTE_FILE