`sh` 与 `bash` 的区别详解

sh 与 bash 的区别详解

1. 历史背景

  • sh (Bourne Shell) :

    由 Stephen Bourne 在 1977 年开发,是 Unix 系统的默认 Shell。语法简洁,但功能有限。

  • bash (Bourne Again Shell) :

    由 Brian Fox 在 1989 年开发,是 sh 的扩展版本,兼容 sh 语法并添加了大量新特性(如命令行编辑、历史记录等)。


2. 主要区别与示例

2.1 脚本声明差异

  • sh 脚本

    默认使用 #!/bin/sh,遵循 POSIX 标准。

    sh 复制代码
    #!/bin/sh
    echo "Hello, sh!"
  • bash 脚本

    使用 #!/bin/bash,支持非 POSIX 扩展语法。

    bash 复制代码
    #!/bin/bash
    echo "Hello, bash!"

2.2 变量与数组

  • sh 不支持数组
    sh 原生不支持数组,需用字符串模拟:

    sh 复制代码
    #!/bin/sh
    list="one two three"
    for item in $list; do
      echo "$item"
    done
  • bash 支持数组
    bash 提供原生数组语法:

    bash 复制代码
    #!/bin/bash
    arr=("one" "two" "three")
    echo "First element: ${arr[0]}"  # 输出 "one"

2.3 字符串操作

  • sh 功能有限

    字符串截取需依赖外部命令(如 cut):

    sh 复制代码
    #!/bin/sh
    str="abcdef"
    substr=$(echo "$str" | cut -c1-3)  # 输出 "abc"
  • bash 内置字符串操作

    支持直接截取:

    bash 复制代码
    #!/bin/bash
    str="abcdef"
    substr=${str:0:3}  # 输出 "abc"

2.4 条件测试语法

  • sh 使用 test 或 [ ]
    sh 不支持 [[ ]],需严格遵循空格规则:

    sh 复制代码
    #!/bin/sh
    if [ "$a" -eq 1 ] && [ "$b" -eq 2 ]; then
      echo "Conditions met."
    fi
  • bash 支持 [[ ]]

    更安全的语法,支持正则匹配:

    bash 复制代码
    #!/bin/bash
    if [[ $a == 1 && $b =~ ^2 ]]; then
      echo "Conditions met."
    fi

2.5 命令行扩展

  • bash 特有扩展

    • 大括号扩展 :

      bash 复制代码
      echo {1..5}      # 输出 "1 2 3 4 5"
    • 进程替换 :

      bash 复制代码
      diff <(ls dir1) <(ls dir2)

    sh 不支持上述语法。


2.6 错误处理

  • bash 支持更多选项

    如 set -e(出错退出)和 set -o pipefail(管道错误捕获):

    bash 复制代码
    #!/bin/bash
    set -euo pipefail
    grep "pattern" file.txt | sort

    sh 对部分选项支持有限。


3. 兼容性

  • bash 兼容模式
    通过 #!/bin/sh 调用 bash 时,若 bash 是系统默认 Shell,会尽量模拟 sh 行为:

    bash 复制代码
    # 使用 `bash --posix` 强制启用 POSIX 模式

4. 总结与使用场景

场景 推荐 Shell
需严格遵循 POSIX 标准 sh
需要高级功能或交互式操作 bash
跨平台脚本 sh(避免依赖扩展)
  • 验证当前 Shell :

    bash 复制代码
    echo $SHELL   # 显示默认 Shell
    echo $0       # 显示当前运行 Shell
相关推荐
码完就睡11 分钟前
Linux——socket网络编程
linux·运维·网络
道尔柯南13 分钟前
【Linux】网络基础概念
linux·运维·网络
傲世仙尊36 分钟前
从抢票事故到锁的原理-互斥条件变量与生产消费模型
linux·驱动开发
AI+程序员在路上36 分钟前
AP6275S蓝牙双接口解析:HCI UART与PCM的分工与协同
linux·c语言·物联网
小此方1 小时前
Linux网络(十八):TCP连接管理详解:从三次握手、四次挥手到CLOSE_WAIT与TIME_WAIT,深入理解2MSL与端口复用
linux·网络·网络协议·tcp/ip
进击的荆棘1 小时前
Linux系统——文件(上)
linux·运维·服务器·文件
k4m7v2pz1 小时前
ThinkPad E490 风扇 “转两秒就停“ 实录:迟滞曲线 + 最短运转时间
linux·脚本·archlinux·thinkpad·风扇·散热
拂拉氏1 小时前
【知识讲解】 Linux文件系统底层认识
linux·文件系统
IT大白鼠1 小时前
彭大帅的AI运维助手——自然语言管理 Linux 集群与网络设备——第 1 篇 · 骨架:说人话,跑命令:自然语言 SSH 运维的骨架
linux·运维·人工智能
牢姐与蒯1 小时前
Linux信号(一).信号产生
linux·运维·服务器·ubuntu