# 4.3 Bash变量是弱类型的
不同于许多其他编程语言,Bash 并不区分变量的类型。本质上说,*Bash 变量是字符串*,但在某些情况下,Bash 允许对变量进行算术运算和比较。决定因素则是变量值是否只含有数字。
样例 4-4. 整数还是字符串?
```bash
#!/bin/bash
# int-or-string.sh
a=2334 # 整数。
let "a += 1"
echo "a = $a " # a = 2335
echo # 依旧是整数。
b=${a/23/BB} # 将 "23" 替换为 "BB"。
# $b 变成了字符串。
echo "b = $b" # b = BB35
declare -i b # 将其声明为整数并没有什么卵用。
echo "b = $b" # b = BB35
let "b += 1" # BB35 + 1
echo "b = $b" # b = 1
echo # Bash 认为字符串的"整数值"为0。
c=BB34
echo "c = $c" # c = BB34
d=${c/BB/23} # 将 "BB" 替换为 "23"。
# $d 变为了一个整数。
echo "d = $d" # d = 2334
let "d += 1" # 2334 + 1
echo "d = $d" # d = 2335
echo
# 如果是空值会怎样呢?
e='' # ...也可以是 e="" 或 e=
echo "e = $e" # e =
let "e += 1" # 空值是否允许进行算术运算?
echo "e = $e" # e = 1
echo # 空值变为了一个整数。
# 如果时未声明的变量呢?
echo "f = $f" # f =
let "f += 1" # 是否允许进行算术运算?
echo "f = $f" # f = 1
echo # 未声明变量变为了一个整数。
#
# 然而……
let "f /= $undecl_var" # 可以除以0么?
# let: f /= : syntax error: operand expected (error token is " ")
# 语法错误!在这里 $undecl_var 并没有被设置为0!
#
# 但是,仍旧……
let "f /= 0"
# let: f /= 0: division by 0 (error token is "0")
# 预期之中。
# 在执行算术运算时,Bash 通常将其空值的整数值设为0。
# 但是不要做这种事情!
# 因为这可能会导致一些意外的后果。
# 结论:上面的结果都表明 Bash 中的变量是弱类型的。
exit $?
```
弱类型变量有利有弊。它可以使编程更加灵活、更加容易(给与你足够的想象空间)。但它也同样的容易造成一些小错误,容易养成粗心大意的编程习惯。
为了减轻脚本持续跟踪变量类型的负担,Bash *不允许*变量声明。
- 第一部分 初见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. 别名