当前位置: 首页 > news >正文

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

shbash 的区别详解

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 标准。

    #!/bin/sh
    echo "Hello, sh!"
    
  • bash 脚本
    使用 #!/bin/bash,支持非 POSIX 扩展语法。

    #!/bin/bash
    echo "Hello, bash!"
    

2.2 变量与数组

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

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

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

2.3 字符串操作

  • sh 功能有限
    字符串截取需依赖外部命令(如 cut):

    #!/bin/sh
    str="abcdef"
    substr=$(echo "$str" | cut -c1-3)  # 输出 "abc"
    
  • bash 内置字符串操作
    支持直接截取:

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

2.4 条件测试语法

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

    #!/bin/sh
    if [ "$a" -eq 1 ] && [ "$b" -eq 2 ]; thenecho "Conditions met."
    fi
    
  • bash 支持 [[ ]]
    更安全的语法,支持正则匹配:

    #!/bin/bash
    if [[ $a == 1 && $b =~ ^2 ]]; thenecho "Conditions met."
    fi
    

2.5 命令行扩展

  • bash 特有扩展

    • 大括号扩展
      echo {1..5}      # 输出 "1 2 3 4 5"
      
    • 进程替换
      diff <(ls dir1) <(ls dir2)
      

    sh 不支持上述语法。


2.6 错误处理

  • bash 支持更多选项
    set -e(出错退出)和 set -o pipefail(管道错误捕获):

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

    sh 对部分选项支持有限。


3. 兼容性

  • bash 兼容模式
    通过 #!/bin/sh 调用 bash 时,若 bash 是系统默认 Shell,会尽量模拟 sh 行为:
    # 使用 `bash --posix` 强制启用 POSIX 模式
    

4. 总结与使用场景

场景推荐 Shell
需严格遵循 POSIX 标准sh
需要高级功能或交互式操作bash
跨平台脚本sh(避免依赖扩展)
  • 验证当前 Shell
    echo $SHELL   # 显示默认 Shell
    echo $0       # 显示当前运行 Shell
    
http://www.lryc.cn/news/541930.html

相关文章:

  • *PyCharm 安装教程
  • [特殊字符] Elasticsearch 双剑合璧:HTTP API 与 Java API 实战整合指南
  • 网络和操作系统基础篇
  • Oracle 连接报错:“ORA-12541:TNS:no listener ”,服务组件中找不到监听服务
  • 内外网文件传输 安全、可控、便捷的跨网数据传输方案
  • 基于Flask的租房信息可视化系统的设计与实现
  • 《Keras 2 :使用 RetinaNet 进行对象检测》:此文为AI自动翻译
  • 【Erdas实验教程】010:监督分类及后处理、精度评价
  • Moonshot AI 新突破:MoBA 为大语言模型长文本处理提效论文速读
  • 【Python量化金融实战】-第1章:Python量化金融概述:1.2 Python在量化金融中的优势与生态
  • react路由总结
  • edge浏览器将书签栏顶部显示
  • AIGC-Stable Diffusion模型介绍
  • 【算法】游艇租贷
  • 科普:Docker run的相关事项
  • Ryu:轻量开源,开启 SDN 新程
  • Python游戏编程之赛车游戏6-2
  • IDEA + 通义灵码AI程序员:快速构建DDD后端工程模板
  • libwebsockets交叉编译全流程
  • 蓝思科技赋能灵伴科技:AI眼镜产能与供应链双升级
  • 谷歌浏览器更新后导致的刷新数据无法显示
  • Nginx学习笔记:常用命令端口占用报错解决Nginx核心配置文件解读
  • Pinia 3.0 正式发布:全面拥抱 Vue 3 生态,升级指南与实战教程
  • at32f103a+rtt+AT组件+esp01s 模块使用
  • EasyRTC:全平台支持与自研算法驱动的智能音视频通讯解决方案
  • Spring 实战技术文档
  • 设计模式教程:解释器模式(Interpreter Pattern)
  • ARM SOC 架构系统M系、R系、A系
  • Hutool - Script:脚本执行封装,以 JavaScript 为例
  • 【开源项目】分布式文本多语言翻译存储平台