|
|
4.1. Variable SubstitutionThe name of a variable is a placeholder for
its value, the data it holds. Referencing its
value is called variable substitution. - $
Let us carefully distinguish between the
name of a variable
and its value. If
variable1 is the name of a
variable, then $variable1
is a reference to its value,
the data item it contains. The only time a
variable appears "naked", without
the $ prefix, is when declared
or assigned, when unset,
when exported,
or in the special case of a variable representing
a signal (see
Example 30-5). Assignment may be with an
= (as in var1=27),
in a read statement,
and at the head of a loop (for var2 in 1 2
3). Enclosing a referenced value in
double quotes (" ") does not
interfere with variable substitution. This is called
partial quoting, sometimes referred to as "weak
quoting". Using single quotes
(' ') causes the variable name to be used
literally, and no substitution will take place. This is
full quoting, sometimes referred to as "strong
quoting". See Chapter 5 for a
detailed discussion. Note that $variable is actually a
simplified alternate form of
${variable}. In contexts
where the $variable syntax
causes an error, the longer form may work (see Section 9.3, below). Example 4-1. Variable assignment and substitution #!/bin/bash
# Variables: assignment and substitution
a=375
hello=$a
#-------------------------------------------------------------------------
# No space permitted on either side of = sign when initializing variables.
# If "VARIABLE =value",
#+ script tries to run "VARIABLE" command with one argument, "=value".
# If "VARIABLE= value",
#+ script tries to run "value" command with
#+ the environmental variable "VARIABLE" set to "".
#-------------------------------------------------------------------------
echo hello # Not a variable reference, just the string "hello".
echo $hello
echo ${hello} # Identical to above.
echo "$hello"
echo "${hello}"
echo
hello="A B C D"
echo $hello # A B C D
echo "$hello" # A B C D
# As you see, echo $hello and echo "$hello" give different results.
# Quoting a variable preserves whitespace.
echo
echo '$hello' # $hello
# Variable referencing disabled by single quotes,
#+ which causes the "$" to be interpreted literally.
# Notice the effect of different types of quoting.
hello= # Setting it to a null value.
echo "\$hello (null value) = $hello"
# Note that setting a variable to a null value is not the same as
#+ unsetting it, although the end result is the same (see below).
# --------------------------------------------------------------
# It is permissible to set multiple variables on the same line,
#+ if separated by white space.
# Caution, this may reduce legibility, and may not be portable.
var1=variable1 var2=variable2 var3=variable3
echo
echo "var1=$var1 var2=$var2 var3=$var3"
# May cause problems with older versions of "sh".
# --------------------------------------------------------------
echo; echo
numbers="one two three"
other_numbers="1 2 3"
# If whitespace within a variable, then quotes necessary.
echo "numbers = $numbers"
echo "other_numbers = $other_numbers" # other_numbers = 1 2 3
echo
echo "uninitialized_variable = $uninitialized_variable"
# Uninitialized variable has null value (no value at all).
uninitialized_variable= # Declaring, but not initializing it
#+ (same as setting it to a null value, as above).
echo "uninitialized_variable = $uninitialized_variable"
# It still has a null value.
uninitialized_variable=23 # Set it.
unset uninitialized_variable # Unset it.
echo "uninitialized_variable = $uninitialized_variable"
# It still has a null value.
echo
exit 0 |
 | An uninitialized variable has a
"null" value - no assigned value at all
(not zero!). Using a variable before assigning a value
to it will usually cause problems. It is nevertheless possible to perform arithmetic operations
on an uninitialized variable.
echo "$uninitialized" # (blank line)
let "uninitialized += 5" # Add 5 to it.
echo "$uninitialized" # 5
# Conclusion:
# An uninitialized variable has no value, however
#+ it acts as if it were 0 in an arithmetic operation.
# This is undocumented (and probably non-portable) behavior. |
See also Example 11-20. |
|