Опубликовано Bash в Ср, 23/12/2009 — 21:13
Пример A-26. Принудительная интерпретация строк
-
#! /bin/bash
-
# unprotect_literal.sh
-
# set -vx
-
:<<—‘_UnProtect_Literal_String_Doc’
-
Copyright (c) Michael S. Zick, 2003; All Rights Reserved
-
Ограничения: Допускается использовать без каких либо ограничений в любой форме.
-
Гарантии: Никаких
-
Издание: $ID$
-
Этот встроенный документ Bash отправит на устройство ‘/dev/null’.
-
(Раскомментарьте команду set, стоящую выше, чтобы убедиться в этом.)
-
Удалите первую строку (Sha-Bang), если вы собираетесь использовать этот сценарий
-
в качестве библиотеки. Не забудьте при этом закомментарить примеры
-
использования процедур (там где это указано).
-
Порядок использования:
-
Противоположная по смыслу функции «$(_pls ‘Literal String’)«.
-
(см. пример protect_literal.sh)
-
StringVar=$(_upls ProtectedSringVariable)
-
Назначение:
-
Выполняет подстановку (интерпретацию) строк в операциях присваивания.
-
Примечание:
-
Имена функций (_*) выбраны таким образом, чтобы избежать
-
конфликтов имен, при подключении данного сценария
-
к пользовательским сценариям, в качестве библиотеки.
-
_UnProtect_Literal_String_Doc
-
_upls() {
-
local IFS=$‘x1B’ # Символ \ESC character (не обязательно)
-
eval echo $@ # Принудительная интерпретация.
-
}
-
# :<<-‘_UnProtect_Literal_String_Test’
-
# # # Раскомментарьте вышестоящую строку, чтобы запретить исполнение нижеследующего кода. # # #
-
_pls() {
-
local IFS=$‘x1B’ # Символ \ESC character (не обязательно)
-
echo $‘\x27’$@$‘\x27’ # Заключить в «строгие» кавычки
-
}
-
# Объявим массив тестовых значений.
-
declare -a arrayZ
-
# Запишем в массив элементы с разного рода кавычками и экранирующими символами.
-
arrayZ=( zero «$(_pls ‘Hello ${Me}’)« ‘Hello ${You}’ «\’Pass: ${pw}\'» )
-
# Выполним присвоение одного массива другому.
-
declare -a array2=( ${arrayZ[@]} )
-
# В результате должно получиться:
-
# — — Тест #3 — —
-
# Элемент 0: zero, длина: 4. # Наш маркер.
-
# Элемент 1: Hello ${Me}, длина: 11. # Вполне предсказуемый результат.
-
# Элемент 2: Hello, длина: 5. # ${You} — была интерпретирована.
-
# # а на ее место подставлена пустая строка
-
# Элемент 3: ‘Pass:, длина: 6. # Элемент был «разбит» на два по пробелу.
-
# Элемент 4: ‘, длина: 1. # Завершающая кавычка попала в отдельный элемент.
-
# set -vx
-
# Инициализируем переменную ‘Me’ каким нибудь значением
-
#+ чтобы увидеть последующую ее интерпретацию.
-
Me=«to the array guy.»
-
# Присвоим результат принудительной интерпретации другой переменной.
-
newVar=$(_upls ${array2[1]})
-
# И посмотрим, что получилось.
-
echo $newVar
-
# Так ли необходима эта функция?
-
newerVar=$(eval echo ${array2[1]})
-
echo $newerVar
-
# Оказывается совсем не обязательно, но функция _upls делает сценарий
-
#+ более понятным.
-
# Она поможет в том случае, если вдруг забудется смысл конструкции
-
#+ $(eval echo … ).
-
# Что произойдет, если часть строки,
-
#+ которая требует дополнительной интерпретации, окажется неинициализированной?
-
unset Me
-
newestVar=$(_upls ${array2[1]})
-
echo $newestVar
-
# Просто и со вкусом! Никаких сообщений, никаких предупреждений, никаких ошибок.
-
# Для чего все это?
-
# Одна из основных проблем в Bash — невозможность записать в переменные
-
#+ некоторые последовательности символов
-
#
-
# Теперь эта проблема разрешается восемью строчками кода
-
#+ (и четырьмя страницами описания).
-
# Где это можно использовать?
-
# Для динамической генерации содержимого Web-страниц,
-
#+ в виде массивов строк.
-
# Содержимое таких страниц может генерироваться командой Bash ‘eval’
-
# Я совсем не призываю заменить PHP, просто высказал интересную мысль.
-
###
-
# _UnProtect_Literal_String_Test
-
# # # Раскомментарьте вышестоящую строку, чтобы запретить исполнение вышестоящего кода. # # #
-
exit 0
- Страница для печати
- 6968 просмотров