$
让我们仔细地区别变量和变量的值。如果variable1是一个变量的名字,那么$variable1就是引用这个变量的值――即这个变量它包含的数据。如果只有变量名出现(即指没有前缀$),那就可能是在1)声明一个变量或是在给这个变量赋值。2)声明废弃这个变量,3)导出(exported)变量,4)或是在变量指示的是一种信号的特殊情况。(参考例子 29-5)。变量赋值可以使用等于号(=),比如:var1=27。也可在read命令和在一个循环的情况下赋值,比如:for var2 in 1 2 3。
在一个双引号(" ")里的变量引用不会禁止变量替换。所以双引号被称为部分引用,有时也称为"弱引用"。而在一个单引号里(' ')的变量替换是被禁止的,变量名只被解释为普通的字面意思。所以单引号被称为"全局引用",有时也被称为强引用。从第五章可得到更多的细节讨论。.
注意$variable实际上只是${variable}的简单的简写形式。在某些场合使用$variable形式会引起错误,这时你可能需要使用${variable}的形式了。
例子变量赋值与替换
#!/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