Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting | ||
---|---|---|
Prev | Chapter 8. Operations and Related Topics | Next |
除非一个数字有特别的前缀或符号,否则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的指正。 |