第四章. 变量和参数介绍

变量 是脚本编程中的如何进行数据表现的办法. 它们可以在算术计算中作为操作数,在一个字符串表达式中作为符号表达抽象的意义或是其他的其它意义。变量是表示计算机内存中保存一种数据需要占的一个位置或一组的位置的标识。

4.1. 变量替换

变量的名字是它的值保存的地方。引用它的值称为变量替换(variable substitution)。.

$

让我们仔细地区别变量和变量的值。如果variable1是一个变量的名字,那么$variable1就是引用这个变量的值――即这个变量它包含的数据。如果只有变量名出现(即指没有前缀$),那就可能是在1)声明一个变量或是在给这个变量赋值。2)声明废弃这个变量,3)导出(exported)变量,4)或是在变量指示的是一种信号的特殊情况。(参考例子 29-5)。变量赋值可以使用等于号(=),比如:var1=27。也可在read命令和在一个循环的情况下赋值,比如:for var2 in 1 2 3。

在一个双引号(" ")里的变量引用不会禁止变量替换。所以双引号被称为部分引用,有时也称为"弱引用"而在一个单引号里(' ')的变量替换是被禁止的,变量名只被解释为普通的字面意思。所以单引号被称为"全局引用",有时也被称为强引用。从第五章可得到更多的细节讨论。.

注意$variable实际上只是${variable}的简单的简写形式。在某些场合使用$variable形式会引起错误,这时你可能需要使用${variable}的形式了。(参考下面的9.3节).


例子 4-1. 变量赋值与替换

   1 #!/bin/bash
   2 
   3 # Variables: 赋值和替换
   4 
   5 a=375
   6 hello=$a
   7 
   8 #-------------------------------------------------------------------------
   9 # =号的左右两边都不能有空白符.
  10 # 如果有一个空白符会怎么样?
  11 
  12 #  如果用 "VARIABLE =value",
  13 #              ^
  14 #+ 脚本会以为"VARIABLE"是一个命令并且此命令带了一个参数"=value"。
  15 
  16 #  如果用 "VARIABLE= value",
  17 #                 ^
  18 #+ 脚本会以为"value"是一个命令,
  19 #+ 并且把环境变量"VARIABLE"赋为空值:""。
  20 #-------------------------------------------------------------------------
  21 
  22 
  23 echo hello    # 没有引用变量,只是输出字符串 "hello".
  24 
  25 echo $hello
  26 echo ${hello} # 这句和上面的一句一样
  27 
  28 echo "$hello"
  29 echo "${hello}"
  30 
  31 echo
  32 
  33 hello="A B  C   D"
  34 echo $hello   # A B C D
  35 echo "$hello" # A B  C   D
  36 # 正如你所看到的:echo $hello和echo "$hello"产生不同的输出。
  37 #                                  ^      ^
  38 # 把变量引起来会保留空白字符.
  39 
  40 echo
  41 
  42 echo '$hello'  # $hello
  43 #    ^      ^
  44 #  在单引号中的变量引用会被禁止,
  45 #+ 字符"$"会仅仅被认为是一个普通的字符,而不是变量的前缀.
  46 
  47 # 注意不同引用的不同效果.
  48 
  49 
  50 hello=    # Setting it to a null value.
  51 echo "\$hello (null value) = $hello"
  52 #  注意具有null值的变量不等同于废弃(unset)此变量
  53 #+ 虽然最后的结果都是一样的(看下面的).
  54 
  55 # --------------------------------------------------------------
  56 
  57 #  在同一行里用空白字符隔开为多个变量赋值是可以的。
  58 #
  59 #  警告:这可能减少可读性,并且可能是不可移植的。
  60 
  61 var1=21  var2=22  var3=$V3
  62 echo
  63 echo "var1=$var1   var2=$var2   var3=$var3"
  64 
  65 # 在老版本的sh中这可能会引起问题
  66 
  67 # --------------------------------------------------------------
  68 
  69 echo; echo
  70 
  71 numbers="one two three"
  72 #           ^   ^
  73 other_numbers="1 2 3"
  74 #               ^ ^
  75 #  如果给变量赋的值中有空白字符,引号是必须的。
  76 #
  77 echo "numbers = $numbers"
  78 echo "other_numbers = $other_numbers"   # other_numbers = 1 2 3
  79 echo
  80 
  81 echo "uninitialized_variable = $uninitialized_variable"
  82 # 未初始化的变量具有null值 (即是没有值).
  83 uninitialized_variable=   #  声明,但没有初始化它 --
  84                           #+ 这就好像上面一样给它设置一个null 值
  85 echo "uninitialized_variable = $uninitialized_variable"
  86                           # 它仍然是null值.
  87 
  88 uninitialized_variable=23       # 赋值
  89 unset uninitialized_variable    # 销毁变量.
  90 echo "uninitialized_variable = $uninitialized_variable"
  91                                 # 结果仍然是null值.
  92 echo
  93 
  94 exit 0

一个未初始化的变量有一个”null”值――表示从没有被赋值过(注意null值不等于零)。在一个变量从未赋值之前就使用它通常会引起问题。

然而,仍然有可能在执行算术计算时使用一个未初始化的变量。
   1 echo "$uninitialized"                                # (blank line)
   2 let "uninitialized += 5"                             # Add 5 to it.
   3 echo "$uninitialized"                                # 5
   4 
   5 #  结论:
   6 #  一个未初始化的变量没有值,
   7 #+ 但是似乎它在算术计算中的值是零。
   8 #  这个无法证实(也可能是不可移植)的行为。
参考例子 11-21.