Пример A-26. Принудительная интерпретация строк

Пример A-26. Принудительная интерпретация строк

  1. #! /bin/bash
  2. # unprotect_literal.sh
  3. # set -vx
  4. :<<-'_UnProtect_Literal_String_Doc'
  5.     Copyright (c) Michael S. Zick, 2003; All Rights Reserved
  6.     Ограничения: Допускается использовать без каких либо ограничений в любой форме.
  7.     Гарантии: Никаких
  8.     Издание: $ID$
  9.     Этот встроенный документ Bash отправит на устройство '/dev/null'.
  10.     (Раскомментарьте команду set, стоящую выше, чтобы убедиться в этом.)
  11.     Удалите первую строку (Sha-Bang), если вы собираетесь использовать этот сценарий
  12.     в качестве библиотеки.  Не забудьте при этом закомментарить примеры
  13.     использования процедур (там где это указано).
  14.     Порядок использования:
  15.         Противоположная по смыслу функции "$(_pls 'Literal String')".
  16.         (см. пример protect_literal.sh)
  17.         StringVar=$(_upls ProtectedSringVariable)
  18.     Назначение:
  19.         Выполняет подстановку (интерпретацию) строк в операциях присваивания.
  20.     Примечание:
  21.         Имена функций (_*) выбраны таким образом, чтобы избежать
  22.         конфликтов имен, при подключении данного сценария
  23.         к пользовательским сценариям, в качестве библиотеки.
  24. _UnProtect_Literal_String_Doc
  25. _upls() {
  26.     local IFS=$'x1B'                # Символ \ESC character (не обязательно)
  27.     eval echo $@                    # Принудительная интерпретация.
  28. }
  29. # :<<-'_UnProtect_Literal_String_Test'
  30. # # # Раскомментарьте вышестоящую строку, чтобы запретить исполнение нижеследующего кода. # # #
  31. _pls() {
  32.     local IFS=$'x1B'                # Символ \ESC character (не обязательно)
  33.     echo $'\x27'$@$'\x27'           # Заключить в "строгие" кавычки
  34. }
  35. # Объявим массив тестовых значений.
  36. declare -a arrayZ
  37. # Запишем в массив элементы с разного рода кавычками и экранирующими символами.
  38. arrayZ=( zero "$(_pls 'Hello ${Me}')" 'Hello ${You}' "\'Pass: ${pw}\'" )
  39. # Выполним присвоение одного массива другому.
  40. declare -a array2=( ${arrayZ[@]} )
  41. # В результате должно получиться:
  42. # - - Тест #3 - -
  43. # Элемент 0: zero, длина: 4.           # Наш маркер.
  44. # Элемент 1: Hello ${Me}, длина: 11.   # Вполне предсказуемый результат.
  45. # Элемент 2: Hello, длина: 5.          # ${You} — была интерпретирована.
  46. #                                      # а на ее место подставлена пустая строка
  47. # Элемент 3: 'Pass:, длина: 6.         # Элемент был "разбит" на два по пробелу.
  48. # Элемент 4: ', длина: 1.              # Завершающая кавычка попала в отдельный элемент.
  49. # set -vx
  50. #  Инициализируем переменную 'Me' каким нибудь значением
  51. #+ чтобы увидеть последующую ее интерпретацию.
  52. Me="to the array guy."
  53. # Присвоим результат принудительной интерпретации другой переменной.
  54. newVar=$(_upls ${array2[1]})
  55. # И посмотрим, что получилось.
  56. echo $newVar
  57. # Так ли необходима эта функция?
  58. newerVar=$(eval echo ${array2[1]})
  59. echo $newerVar
  60. #  Оказывается совсем не обязательно, но функция _upls делает сценарий
  61. #+ более понятным.
  62. #  Она поможет в том случае, если вдруг забудется смысл конструкции
  63. #+ $(eval echo ... ).
  64. # Что произойдет, если часть строки,
  65. #+ которая требует дополнительной интерпретации, окажется неинициализированной?
  66. unset Me
  67. newestVar=$(_upls ${array2[1]})
  68. echo $newestVar
  69. # Просто и со вкусом! Никаких сообщений, никаких предупреждений, никаких ошибок.
  70. #  Для чего все это?
  71. #  Одна из основных проблем в Bash — невозможность записать в переменные
  72. #+ некоторые последовательности символов
  73. #
  74. #  Теперь эта проблема разрешается восемью строчками кода
  75. #+ (и четырьмя страницами описания).
  76. #  Где это можно использовать?
  77. #  Для динамической генерации содержимого Web-страниц,
  78. #+ в виде массивов строк.
  79. #  Содержимое таких страниц может генерироваться командой Bash 'eval'
  80. #  Я совсем не призываю заменить PHP, просто высказал интересную мысль.
  81. ###
  82. # _UnProtect_Literal_String_Test
  83. # # # Раскомментарьте вышестоящую строку, чтобы запретить исполнение вышестоящего кода. # # #
  84. exit 0