#!/bin/bash

# Variables: 赋值和替换

a=375
hello=$a

#-------------------------------------------------------------------------
# =号的左右两边都不能有空白符.
# 如果有一个空白符会怎么样？
#
#  如果用 "VARIABLE =value",
#              ^
#+ 脚本会以为"VARIABLE"是一个命令并且此命令带了一个参数"=value"。
# 
#  如果用 "VARIABLE= value",
#               　　^
#+ 脚本会以为"value"是一个命令，
#+ 并且把环境变量"VARIABLE"赋为空值：""。
#-------------------------------------------------------------------------


echo hello    # 没有引用变量，只是输出字符串 "hello".

echo $hello
echo ${hello} # 这句和上面的一句一样

echo "$hello"
echo "${hello}"

echo

hello="A B  C   D"
echo $hello   # A B C D
echo "$hello" # A B  C   D
# 正如你所看到的：echo $hello和echo "$hello"产生不同的输出。
#                                 　^      ^
# 把变量引起来会保留空白字符.

echo

echo '$hello'  # $hello
#    ^      ^
#  在单引号中的变量引用会被禁止,
#+ 字符"$"会仅仅被认为是一个普通的字符，而不是变量的前缀.

# 注意不同引用的不同效果.


hello=    # Setting it to a null value.
echo "\$hello (null value) = $hello"
#  注意具有null值的变量不等同于废弃(unset)此变量
#+ 虽然最后的结果都是一样的（看下面的）.

# --------------------------------------------------------------

#  在同一行里用空白字符隔开为多个变量赋值是可以的。
#
#  警告：这可能减少可读性，并且可能是不可移植的。

var1=21  var2=22  var3=$V3
echo
echo "var1=$var1   var2=$var2   var3=$var3"

# 在老版本的sh中这可能会引起问题

# --------------------------------------------------------------

echo; echo

numbers="one two three"
#           ^   ^
other_numbers="1 2 3"
#               ^ ^
#  如果给变量赋的值中有空白字符，引号是必须的。
#
echo "numbers = $numbers"
echo "other_numbers = $other_numbers"   # other_numbers = 1 2 3
echo

echo "uninitialized_variable = $uninitialized_variable"
# 未初始化的变量具有null值 (即是没有值).
uninitialized_variable=   #  声明，但没有初始化它 --
                          #+ 这就好像上面一样给它设置一个null 值
echo "uninitialized_variable = $uninitialized_variable"
                          # 它仍然是null值.

uninitialized_variable=23       # 赋值
unset uninitialized_variable    # 销毁变量.
echo "uninitialized_variable = $uninitialized_variable"
                                # 结果仍然是null值.
echo

exit 0