bash 和 dash 都是 Unix/Linux 系统中的 Shell 解释器,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比:
1. 基本区别
| 特性 | bash (Bourne-Again SHell) | dash (Debian Almquist SHell) |
|---|---|---|
| 来源 | GNU 项目,增强版 sh |
轻量级 sh 兼容实现(源自 ash) |
| 功能 | 功能丰富,支持高级编程特性 | 极简,仅 POSIX sh 标准功能 |
| 速度 | 较慢(功能多,启动开销大) | 极快(适合脚本启动和系统初始化) |
| 默认 Shell | 多数 Linux 发行版的用户默认 Shell | Ubuntu/Debian 的 /bin/sh 默认 |
| 用途 | 交互式命令行、复杂脚本 | 系统启动脚本(如 /etc/init.d/*) |
2. 语法差异
(1) 数组
- bash 支持数组:
arr=("a" "b" "c") echo ${arr[1]} # 输出 "b" - dash 不支持数组,只能用字符串:
arr="a b c" for item in $arr; do echo "$item" # 逐个输出 a b c done
(2) 条件判断
- bash 支持
[[ ]]和高级比较:if [[ "$var" == "value" && -f "file.txt" ]]; then echo "条件成立" fi - dash 只能用
[ ](POSIX 标准):if [ "$var" = "value" ] && [ -f "file.txt" ]; then echo "条件成立" fi
(3) 函数定义
- bash 支持
function关键字:function hello() { echo "Hello, bash!" } - dash 只能用
函数名():hello() { echo "Hello, dash!" }
(4) 字符串操作
- bash 支持子字符串、替换等:
str="hello_world" echo ${str:6} # 输出 "world" echo ${str/_/ } # 输出 "hello world" - dash 需依赖外部命令(如
cut、sed):str="hello_world" echo "$str" | cut -d'_' -f2 # 输出 "world"
3. 性能对比
- 启动速度:
dash的启动时间比bash快 3-5 倍,适合系统初始化脚本(如 Ubuntu 的/bin/sh指向dash以加速启动)。 - 内存占用:
dash更轻量,适合资源受限的环境(如嵌入式系统)。
4. 兼容性问题
- 脚本错误:
如果脚本用bash语法编写(如[[ ]]、数组),但用dash运行(如sh script.sh),会报错:Syntax error: "(" unexpected # 数组或函数语法错误 - 解决方案:
- 显式指定解释器:
# 在脚本第一行声明使用 bash #!/bin/bash - 修改脚本为 POSIX 兼容(避免
bash特有语法)。
- 显式指定解释器:
5. 如何检查当前 sh 是 bash 还是 dash?
# 查看 /bin/sh 的链接目标
ls -l /bin/sh
# 输出示例:/bin/sh -> dash(Ubuntu 默认)
6. 总结
| 场景 | 推荐 Shell | 原因 |
|---|---|---|
| 交互式命令行 | bash |
功能丰富(补全、历史记录等) |
| 系统启动脚本 | dash |
速度快,节省资源 |
| 通用脚本(跨平台) | POSIX sh |
兼容性最好(避免 bash 特性) |
| 复杂脚本(需要数组等) | bash |
支持高级编程特性 |
最佳实践:
- 如果是系统脚本(如
/etc/init.d/*),用dash兼容语法。 - 如果是用户脚本,优先用
bash,并在第一行声明#!/bin/bash。