# 8.2. 数字常量
通常情况下,shell脚本会把数字以十进制整数看待(base 10),除非数字加了特殊的前缀或标记。
带前缀0的数字是八进制数(base 8);带前缀0x的数字是十六进制数(base 16)。
内嵌 # 的数字会以 BASE#NUMBER 的方式进行求值(不能超出当前shell支持整数的范围)。
**样例 8-4. 数字常量的表示**
```
#!/bin/bash
# numbers.sh: 不同进制数的表示
# 十进制数: 默认
let "dec = 32"
echo "decimal number = $dec" # 32
# 一切正常。
# 八进制数: 带前导'0'的数
let "oct = 032"
echo "octal number = $oct" # 26
# 结果以 十进制 打印输出了。
# ------ ------ -----------
# 十六进制数: 带前导'0x'或'0X'的数
let "hex = 0x32"
echo "hexadecimal number = $hex" # 50
echo $((0x9abc)) # 39612
# ^^ ^^ 双圆括号进行表达式求值
# 结果以十进制打印输出。
# 其他进制数: BASE#NUMBER
# BASE 范围: 2 - 64
# NUMBER 必须以 BASE 规定的正确形式书写,如下:
let "bin = 2#111100111001101"
echo "binary number = $bin" # 31181
let "b32 = 32#77"
echo "base-32 number = $b32" # 231
let "b64 = 64#@_"
echo "base-64 number = $b64" # 4031
# 这种表示法只对进制范围(2 - 64)内的 ASCII 字符有效。
# 10 数字 + 26 小写字母 + 26 大写字母 + @ + _
echo
echo $((36#zz)) $((2#10101010)) $((16#AF16)) $((53#1aA))
# 1295 170 44822 3375
# 重要提醒:
# ---------
# 使用超出进制范围以外的符号会报错。
let "bad_oct = 081"
# (可能的) 报错信息:
# bad_oct = 081: value too great for base (error token is "081")
# Octal numbers use only digits in the range 0 - 7.
exit $? # 退出码 = 1 (错误)
# 感谢 Rich Bartell 和 Stephane Chazelas 的说明。
```
- 第一部分 初见shell
- 1. 为什么使用shell编程
- 2. 和Sha-Bang(#!)一起出发
- 2.1 调用一个脚本
- 2.2 牛刀小试
- 第二部分 shell基础
- 3. 特殊字符
- 4. 变量与参数
- 4.1 变量替换
- 4.2 变量赋值
- 4.3 Bash弱类型变量
- 4.4 特殊变量类型
- 5. 引用
- 5.1 引用变量
- 5.2 转义
- 6. 退出与退出状态
- 7. 测试
- 7.1 测试结构
- 7.2 文件测试操作
- 7.3 其他比较操作
- 7.4 嵌套 if/then 条件测试
- 7.5 牛刀小试
- 8. 运算符相关话题
- 8.1 运算符
- 8.2 数字常量
- 8.3 双圆括号结构
- 8.4 运算符优先级
- 第三部分 shell进阶
- 10. 变量处理
- 10.1 字符串处理
- 10.1.1 使用 awk 处理字符串
- 10.1.2 参考资料
- 10.2 参数替换
- 11. 循环与分支
- 11.1 循环
- 11.2 嵌套循环
- 11.3 循环控制
- 11.4 测试与分支
- 12. 命令替换
- 13. 算术扩展
- 14. 休息时间
- 第五部分 进阶话题
- 19. 嵌入文档
- 20. I/O 重定向
- 20.1 使用 exec
- 20.2 重定向代码块
- 20.3 应用程序
- 22. 限制模式的Shell
- 23. 进程替换
- 26. 列表结构
- 25. 别名