8.2. 数字常量

通常情况下,shell脚本会把数字以十进制整数看待(base 10),除非数字加了特殊的前缀或标记。 带前缀0的数字是八进制数(base 8);带前缀0x的数字是十六进制数(base 16)。 内嵌 # 的数字会以 BASE#NUMBER 的方式进行求值(不能超出当前shell支持整数的范围)。

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

1. #!/bin/bash
2. # numbers.sh: 不同进制数的表示

4. # 十进制数: 默认
5. let "dec = 32"
6. echo "decimal number = $dec"             # 32
7. # 一切正常。

10. # 八进制数: 带前导'0'的数
11. let "oct = 032"
12. echo "octal number = $oct"               # 26
13. # 结果以 十进制 打印输出了。
14. # ------ ------ -----------

17. # 十六进制数: 带前导'0x'或'0X'的数
18. let "hex = 0x32"
19. echo "hexadecimal number = $hex"         # 50

21. echo $((0x9abc))                         # 39612
22. #     ^^      ^^   双圆括号进行表达式求值
23. # 结果以十进制打印输出。

27. # 其他进制数: BASE#NUMBER
28. # BASE 范围:  2 - 64
29. # NUMBER 必须以 BASE 规定的正确形式书写,如下:

31. let "bin = 2#111100111001101"
32. echo "binary number = $bin"              # 31181

34. let "b32 = 32#77"
35. echo "base-32 number = $b32"             # 231

37. let "b64 = 64#@_"
38. echo "base-64 number = $b64"             # 4031

40. # 这种表示法只对进制范围(2 - 64)内的 ASCII 字符有效。
41. # 10 数字 + 26 小写字母 + 26 大写字母 + @ + _

44. echo

46. echo $((36#zz)) $((2#10101010)) $((16#AF16)) $((53#1aA))
47. # 1295 170 44822 3375

49. #  重要提醒:
50. #  ---------
51. #  使用超出进制范围以外的符号会报错。

53. let "bad_oct = 081"

55. # (可能的) 报错信息:
56. #  bad_oct = 081: value too great for base (error token is "081")
57. #              Octal numbers use only digits in the range 0 - 7.

59. exit $?        # 退出码 = 1 (错误)

61. # 感谢 Rich Bartell 和 Stephane Chazelas 的说明。