一.基本对比

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。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐