Bash Unprotect literal
Bash
Download (.zip)
#! /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 to 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
|