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

news/2025/2/24 15:44:42

bash__0">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 扩展语法。

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

2.2 变量与数组

  • 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):

    #!/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 不支持 [[ ]],需严格遵循空格规则:

    #!/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
    

http://www.niftyadmin.cn/n/5864545.html

相关文章

第15届 蓝桥杯 C++编程青少组中/高级选拔赛 202401 真题答案及解析

第 1 题 【 单选题 】 表达式117 % 16 的结果是( )。 A:0 B:5 C:7 D:10 解析: % 是取模运算符,用于计算两个数相除后的余数。 计算 117 / 16,结果是 7,余数是 5。因此,117 % 16 = 5。答案: B 第 2 题 【 单选题 】 下列选项中,字符数组定义正确的是( …

MongoDB03 - MongoDB索引,事务和安全

MongoDB索引&#xff0c;事务和安全 文章目录 MongoDB索引&#xff0c;事务和安全一&#xff1a;事务和锁1&#xff1a;MongoDB事务机制&#xff1a;不建议使用2&#xff1a;MongoDB的锁机制 二&#xff1a;MongoDB的索引机制1&#xff1a;初始索引2&#xff1a;索引详解2.1&am…

【每日八股】计算机网络篇(一):概述

OSI 的 7 层网络模型&#xff1f; OSI&#xff08;Open Systems Interconnection&#xff0c;开放互联系统&#xff09;是由国际标准化组织&#xff08;ISO&#xff09;提出的一种网络通信模型。 自上而下&#xff0c;OSI 可以被分为七层&#xff0c;分别是&#xff1a;应用层…

如何通过 Docker 在没有域名的情况下快速上线客服系统

很多小伙伴想上线完全私有化的客服系统&#xff0c;却因域名注册备案比较麻烦而望而却步。 其实不需要域名&#xff0c;只要租用云服务器&#xff0c;获得公网 IP 地址之后&#xff0c;就可以快速上线客服系统。 首先租用一台公网服务器&#xff0c;选择 Ubuntu 24.10 安装 …

全星研发管理APQP软件系统:让研发项目管理化繁为简,助力企业高效研发

全星研发管理APQP软件系统&#xff1a;让研发项目管理化繁为简&#xff0c;助力企业高效研发 在竞争激烈的市场环境下&#xff0c;企业研发项目面临着时间紧、任务重、协同难等挑战。传统的项目管理方式效率低下&#xff0c;难以满足快速迭代的需求。 全星研发管理APQP软件系…

无人机仿真、感知、规划

文章目录 1.仿真环境1.1 博客教学1.2 教学视频1基础无人机仿真教学视频介绍2 XTDrone无人机仿真与控制技术全面教程3 ROS机器人集群仿真与实践教程 1.3 开源项目及插件1 ROS2-Gazebo Drone Simulation Plugin2 RotorS_UAV_Gazebo_Simulator3 自主无人机与Aruco导航教程4 基于 A…

PyEcharts 数据可视化:从入门到实战

一、PyEcharts 简介 PyEcharts 是基于百度开源可视化库 ECharts 的 Python 数据可视化工具&#xff0c;支持生成交互式的 HTML 格式图表。相较于 Matplotlib 等静态图表库&#xff0c;PyEcharts 具有以下优势&#xff1a; 丰富的图表类型&#xff08;30&#xff09;动态交互功…

安全生产月安全知识竞赛主持稿串词

女:尊敬的各位领导、各位来宾 男:各位参赛选手、观众朋友们 合:大家好&#xff5e; 女:安全是天&#xff0c;有了这一份天&#xff0c;我们的员工就会多一份幸福&#xff0c; 我们的企业就会多一丝光彩。 男:安全是地&#xff0c;有了这一片地&#xff0c;我们的员工就多了一…