一.基本对比
1.基础概念
#!/bin/bash # 使用 bash shell 执行脚本
#!/bin/sh # 使用系统默认的 sh 执行脚本
2.主要区别

二.实践建议
1.何时使用 #!/bin/bash
#!/bin/bash
以下情况使用 bash:
1.1. 需要数组
declare -a servers=("web1" "web2" "db1")
1.2. 需要进程替换
comm -23 <(sort file1) <(sort file2)
1.3. 需要正则表达式匹配
if [[ "input" =\~ \^\[A-Z\]\[a-z\]+ ]]; then
1.4. 需要高级字符串操作
filename="${fullpath##*/}" # 获取文件名
dirname="${fullpath%/*}" # 获取目录名
1.5. 需要关联数组
declare -A config
config["host"]="localhost"
config["port"]="8080"
1.6. 需要更多调试功能
set -euo pipefail # 严格模式
trap 'echo "错误发生在第 $LINENO 行"' ERR
1.7. 需要 here-string
read -r first_line <<< "$content"
2. 何时使用 #!/bin/sh
#!/bin/sh
以下情况使用 sh:
2.1. 系统启动脚本(init.d 脚本)
/etc/init.d/* 通常使用 sh 以保证兼容性
2.2. Docker 容器基础镜像
Alpine Linux 等小型镜像只有 sh
2.3. 需要最大兼容性的脚本
在多种 Unix 系统上运行
2.4. 简单的系统工具脚本
不需要 bash 高级特性
2.5. 嵌入式系统
资源有限的环境
2.6. 确保 POSIX 合规
用于标准化的项目
3.总结

建议:
个人脚本/项目脚本:使用 #!/bin/bash,享受丰富功能
系统脚本/发布脚本:使用 #!/bin/sh,确保最大兼容性
黄金法则:如果不确定是否需要 bash 特性,先用 #!/bin/sh 编写,遇到限制时再切换到 #!/bin/bash。