8.2. 数字常量

除非一个数字有特别的前缀或符号,否则shell脚本把它当成十进制的数。一个前缀为0的数字是八进制数。一个前缀为0x的数字是十六进制数。一个数用内嵌的#来求值则看成BASE#NUMBER(有范围和符号限制)(译者注:BASE#NUMBER即:基数#数值,参考下面的例子)。


例子 8-4. 数字常量的表示法

   1 #!/bin/bash
   2 # numbers.sh: 不同基数的数字表示法.
   3 
   4 # 十进制数: 它是默认的
   5 let "dec = 32"
   6 echo "decimal number = $dec"             # 32
   7 # 这儿没有什么特别的.
   8 
   9 
  10 # 八进制数: 以'0'(零)为前缀
  11 let "oct = 032"
  12 echo "octal number = $oct"               # 26
  13 # 结果表示为十进制.
  14 # --------- ------ -- -------
  15 
  16 # 十六进制: 以'0x'或'0X'为前缀
  17 let "hex = 0x32"
  18 echo "hexadecimal number = $hex"         # 50
  19 # 以十进制的形式表示.
  20 
  21 # 其他的进制的表示形式: BASE#NUMBER
  22 # BASE值在2和64之间.
  23 # NUMBER必须使用在BASE范围内的符号,看下面的示例.
  24 
  25 
  26 let "bin = 2#111100111001101"
  27 echo "binary number = $bin"              # 31181
  28 
  29 let "b32 = 32#77"
  30 echo "base-32 number = $b32"             # 231
  31 
  32 let "b64 = 64#@_"
  33 echo "base-64 number = $b64"             # 4031
  34 # 这个符号只能工作在ASCII码值为2-64的范围限制.
  35 # 10个数字+26个小写字母+26个大写字母+ @ + _
  36 
  37 
  38 echo
  39 
  40 echo $((36#zz)) $((2#10101010)) $((16#AF16)) $((53#1aA))
  41                                          # 1295 170 44822 3375
  42 
  43 
  44 #  重要提示:
  45 #  --------------
  46 #  使用一个超出给定进制的数字将会引起一个错误信息。
  47 #+ gives an error message.
  48 
  49 let "bad_oct = 081"
  50 # ((部分的) 错误信息输出:
  51 #  bad_oct = 081: value too great for base (error token is "081")
  52 #              八进制数字只能使用数字0-7.
  53 
  54 exit 0       # 多谢Rich Bartell和Stephane Chazelas的指正。