mirror of https://github.com/tLDP/LDP
124 lines
3.6 KiB
Bash
124 lines
3.6 KiB
Bash
#! /bin/bash
|
|
# unprotect_literal.sh
|
|
|
|
# set -vx
|
|
|
|
:<<-'_UnProtect_Literal_String_Doc'
|
|
|
|
Copyright (c) Michael S. Zick, 2003; All Rights Reserved
|
|
License: Unrestricted reuse in any form, for any purpose.
|
|
Warranty: None
|
|
Revision: $ID$
|
|
|
|
Documentation redirected to the Bash no-operation. Bash will
|
|
'/dev/null' this block when the script is first read.
|
|
(Uncomment the above set command to see this action.)
|
|
|
|
Remove the first (Sha-Bang) line when sourcing this as a library
|
|
procedure. Also comment out the example use code in the two
|
|
places where shown.
|
|
|
|
|
|
Usage:
|
|
Complement of the "$(_pls 'Literal String')" function.
|
|
(See the protect_literal.sh example.)
|
|
|
|
StringVar=$(_upls ProtectedSringVariable)
|
|
|
|
Does:
|
|
When used on the right-hand-side of an assignment statement;
|
|
makes the substitions embedded in the protected string.
|
|
|
|
Notes:
|
|
The strange names (_*) are used to avoid trampling on
|
|
the user's chosen names when this is sourced as a
|
|
library.
|
|
|
|
|
|
_UnProtect_Literal_String_Doc
|
|
|
|
_upls() {
|
|
local IFS=$'x1B' # \ESC character (not required)
|
|
eval echo $@ # Substitution on the glob.
|
|
}
|
|
|
|
# :<<-'_UnProtect_Literal_String_Test'
|
|
# # # Remove the above "# " to disable this code. # # #
|
|
|
|
|
|
_pls() {
|
|
local IFS=$'x1B' # \ESC character (not required)
|
|
echo $'\x27'$@$'\x27' # Hard quoted parameter glob
|
|
}
|
|
|
|
# Declare an array for test values.
|
|
declare -a arrayZ
|
|
|
|
# Assign elements with various types of quotes and escapes.
|
|
arrayZ=( zero "$(_pls 'Hello ${Me}')" 'Hello ${You}' "\'Pass: ${pw}\'" )
|
|
|
|
# Now make an assignment with that result.
|
|
declare -a array2=( ${arrayZ[@]} )
|
|
|
|
# Which yielded:
|
|
# - - Test Three - -
|
|
# Element 0: zero is: 4 long # Our marker element.
|
|
# Element 1: Hello ${Me} is: 11 long # Intended result.
|
|
# Element 2: Hello is: 5 long # ${You} expanded to nothing.
|
|
# Element 3: 'Pass: is: 6 long # Split on the whitespace.
|
|
# Element 4: ' is: 1 long # The end quote is here now.
|
|
|
|
# set -vx
|
|
|
|
# Initialize 'Me' to something for the embedded ${Me} substitution.
|
|
# This needs to be done ONLY just prior to evaluating the
|
|
#+ protected string.
|
|
# (This is why it was protected to begin with.)
|
|
|
|
Me="to the array guy."
|
|
|
|
# Set a string variable destination to the result.
|
|
newVar=$(_upls ${array2[1]})
|
|
|
|
# Show what the contents are.
|
|
echo $newVar
|
|
|
|
# Do we really need a function to do this?
|
|
newerVar=$(eval echo ${array2[1]})
|
|
echo $newerVar
|
|
|
|
# I guess not, but the _upls function gives us a place to hang
|
|
#+ the documentation on.
|
|
# This helps when we forget what a # construction like:
|
|
#+ $(eval echo ... ) means.
|
|
|
|
# What if Me isn't set when the protected string is evaluated?
|
|
unset Me
|
|
newestVar=$(_upls ${array2[1]})
|
|
echo $newestVar
|
|
|
|
# Just gone, no hints, no runs, no errors.
|
|
|
|
# Why in the world?
|
|
# Setting the contents of a string variable containing character
|
|
#+ sequences that have a meaning in Bash is a general problem in
|
|
#+ script programming.
|
|
#
|
|
# This problem is now solved in eight lines of code
|
|
#+ (and four pages of description).
|
|
|
|
# Where is all this going?
|
|
# Dynamic content Web pages as an array of Bash strings.
|
|
# Content set per request by a Bash 'eval' command
|
|
#+ on the stored page template.
|
|
# Not intended to replace PHP, just an interesting thing to do.
|
|
###
|
|
# Don't have a webserver application?
|
|
# No problem, check the example directory of the Bash source;
|
|
#+ there is a Bash script for that also.
|
|
|
|
# _UnProtect_Literal_String_Test
|
|
# # # Remove the above "# " to disable this code. # # #
|
|
|
|
exit 0
|