sh和bash都是Linux系统中常用的SHELL解释器,二者在定位、功能、兼容性等方面存在明显差异,理解这些差异能帮助我们更合理地选择和使用SHELL环境。

sh和bash的基础定义
sh是Bourne SHELL的缩写,是Unix系统中最早出现的SHELL解释器之一,由Stephen Bourne开发,设计目标是提供一个轻量、通用的脚本执行环境,语法规范相对基础,兼容性极强,几乎可以在所有类Unix系统上运行。
bash是Bourne Again SHELL的缩写,是GNU项目开发的SHELL,作为sh的增强版本,bash完全兼容sh的基础语法,同时新增了大量实用功能,是目前大多数Linux发行版的默认SHELL。
核心区别对比
1. 功能特性差异
sh仅支持最基础的SHELL语法,没有太多扩展功能,比如不支持数组、不支持<<<重定向、不支持正则表达式匹配等高级特性。而bash在sh的基础上新增了大量功能,常见的扩展特性包括:
- 支持一维数组定义和操作
- 支持命令行历史记录、命令补全、别名设置
- 支持<<< here字符串重定向、<() 进程替换
- 支持[[ ]]条件判断语法,支持正则匹配
- 支持函数递归调用、局部变量定义
2. 兼容性差异
sh的语法是POSIX SHELL标准的基础实现,因此sh脚本可以在几乎所有类Unix系统上直接执行,兼容性极强。bash虽然兼容sh的基础语法,但bash脚本中如果使用了bash特有的扩展功能,就无法在仅支持sh的环境中运行。
3. 执行方式差异
当脚本第一行指定解释器为#!/bin/sh时,系统会调用sh(或兼容sh的解释器)执行脚本,此时即使系统默认SHELL是bash,也会按照sh的语法规范运行脚本,不支持bash扩展特性。如果第一行指定为#!/bin/bash,则会调用bash执行脚本,支持所有bash特性。
代码示例说明
下面通过一个简单的脚本示例展示二者的差异,首先编写一个使用bash数组特性的脚本:
#!/bin/bash
# 定义bash数组
arr=("apple" "banana" "orange")
# 遍历数组
for i in "${arr[@]}"; do
echo "当前元素: $i"
done
如果将这个脚本的解释器改为#!/bin/sh,执行时就会出现语法错误,因为sh不支持数组语法。再来看一个sh兼容的基础脚本示例:
#!/bin/sh
# sh兼容的基础语法脚本
name="Linux"
echo "欢迎学习 $name SHELL相关知识"
# 基础循环
count=1
while [ $count -le 3 ]; do
echo "计数: $count"
count=$((count + 1))
done
这个脚本仅使用sh支持的基础语法,无论是用sh还是bash执行,都可以正常运行。
适用场景建议
如果编写的脚本需要跨不同类Unix系统运行,且不需要复杂功能,优先选择sh作为解释器,保证兼容性。如果脚本仅在Linux系统运行,且需要使用数组、正则匹配等高级功能,选择bash作为解释器会更高效。另外,日常交互式使用SHELL时,bash的功能更丰富,使用体验更好。
注意:部分Linux系统中/bin/sh是bash的软链接,此时用sh执行脚本也会支持部分bash特性,但为了保证脚本的通用性,编写sh脚本时仍建议只使用标准sh语法。
shbashLinux_SHELLshell脚本修改时间:2026-06-18 20:15:27