`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.rhkb.cn/news/23303.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计SpringBoot+Vue.jst房屋租赁系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

DevEco Studio常用快捷键以及如何跟AndroidStudio的保持同步

DevEco Studio快捷键 DevEco Studio是华为推出的用于开发HarmonyOS应用的集成开发环境&#xff0c;它提供了丰富的快捷键以提高开发效率&#xff0c;以下为你详细介绍不同操作场景下的常用快捷键&#xff1a; 通用操作快捷键 操作描述Windows/Linux 快捷键Mac 快捷键打开设置窗…

qt5实现表盘的旋转效果,通过提升QLabel类

因为工作需要&#xff0c;需要实现温度的表盘展示效果 实现思路&#xff1a; 通过提示声QLabel控价类&#xff0c;实现报盘的旋转和展示效果 1. 编写一个QLabel的类MyQLabel,实现两个方法 1. void paintEvent(QPaintEvent *event); //重绘函数 2. void valueChanged(int va…

vscode settings(一):全局| 用户设置常用的设置项

参考资料 Visual Studio Code权威指南 by 韩骏 一. 全局设置与用户设置 1.1 Vscode支持两种不同范围的设置 用户设置(User Settings)&#xff1a;这是一个全局范围的设置&#xff0c;会应用到所有的Visual Studio Code实例中。工作区设置(Workspace Settings)&#xff1a;设…

C# 将非托管Dll嵌入exe中(一种实现方法)

一、环境准备 电脑系统&#xff1a;Windows 10 专业版 20H2 IDE&#xff1a;Microsoft Visual Studio Professional 2022 (64 位) - Current 版本 17.11.4 其他&#xff1a; 二、测试目的 将基于C创建DLL库&#xff0c;封装到C#生成的exe中。 一般C创建的库&#xff0c;在…

在 Mac mini M2 上使用Docker快速部署MaxKB:打造本地知识库问答系统

随着大语言模型的广泛应用&#xff0c;知识库问答系统逐渐成为提升工作效率和个人学习的有力工具。MaxKB是一款基于LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统&#xff0c;支持多模型对接、文档上传和自动爬取等功能。本文将详细介绍如何在Ma…

Jenkins上无法查看已成功生成的Junit报告

如果你已确认 JUnit 报告在工作空间中被成功生成&#xff0c;但在 Jenkins 构建页面上却看不到 "Test Result" 或 "Test Report" 的链接&#xff0c;这通常意味着 Jenkins 没有正确地配置用来处理和显示这些报告的步骤。这里有几个可能的原因和解决方法&am…

vue+element-plus简洁完美实现淘宝网站模板

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.详情 4.购物车 5.登陆页 三、源码实现 1.路由配置 2.依赖包 四、总结 一、项目介绍 项目在线预览&#xff1a;点击访问 本项目为vue项目&#xff0c;参考淘宝官方样式为主题来设计元素&#xff0c;简洁美观&…

stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)

简介: 这个小车的芯片是STM32F103C8T6&#xff0c;其他的芯片也可以照猫画虎,基本配置差不多,要注意的就是,管脚复用,管脚的特殊功能,(这点不用担心,hal库每个管脚的功能都会给你罗列,很方便的.)由于我做的比较简单,只是用到了几个简单外设.主要是由带霍尔编码器电机的车模,电机…

红队内网攻防渗透:内网渗透之内网对抗:实战项目VPC2打靶父子域三层路由某绒免杀下载突破约束委派域控提权

红队内网攻防渗透 实战网络攻防靶场记录1.靶机配置信息讲解2.靶场渗透完整流程2.1 入口点:192.168.139.130(win2008 R2)2.1.1 tomcat后台war包获取权限2.1.2 tomcat使用后门上线CS平台2.1.3 信息收集获取数据库密码2.2 入口点横向:192.168.10.11 (win2012 SQL)2.2.1 SQLs…

C语言【指针篇】(一)

前言 指针基础概念理解&#xff0c;从底层出发理解指针 C语言【指针篇】&#xff08;一&#xff09; 前言正文1. 内存和地址1.1 内存1.2 究竟该如何理解编址 2. 指针变量和地址2.1 取地址操作符(&)2.2 指针变量和解引用操作符(*)2.3 指针变量的大小 3. 指针变量类型的意义…

【每日八股】Redis篇(二):数据结构

Redis 数据类型&#xff1f; 主要有 STRING、LIST、ZSET、SET 和 HASH。 STRING String 类型底层的数据结构实现主要是 SDS&#xff08;简单动态字符串&#xff09;&#xff0c;其主要应用场景包括&#xff1a; 缓存对象&#xff1a;可以用 STRING 缓存整个对象的 JSON&…

文章精读篇——用于遥感小样本语义分割的可学习Prompt

题目&#xff1a;Learnable Prompt for Few-Shot Semantic Segmentation in Remote Sensing Domain 会议&#xff1a;CVPR 2024 Workshop 论文&#xff1a;10.48550/arXiv.2404.10307 相关竞赛&#xff1a;https://codalab.lisn.upsaclay.fr/competitions/17568 年份&#…

游戏引擎学习第119天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾和今天的议程 如果你们还记得昨天的进展&#xff0c;我们刚刚完成了优化工作&#xff0c;目标是让某个程序能够尽可能快速地运行。我觉得现在可以说它已经快速运行了。虽然可能还没有达到最快的速度&#xff0c;但我们…

HybridCLR+Adressable+Springboot热更

本文章会手把手教大家如何搭建HybridCLRAdressableSpringboot热更。 创作不易&#xff0c;动动发财的小手点个赞。 安装华佗 首先我们按照官网的快速上手指南搭建一个简易的项目&#xff1a; 快速上手 | HybridCLR 注意在热更的代码里添加程序集。把用到的工具放到程序集里…

多无人机协同路径规划(论文+仿真)

在现代技术的快速发展下&#xff0c;飞行器的种类也越来越多了&#xff0c;他们的应用场景和应用功能也越来越完善和复杂。举例来说&#xff0c;ps-x625型号就是大疆无人机生产的就是在植物保护方面有很好的应用&#xff0c;宝鸡的兴义生产的X8型号无人机在航空领域有很大突破&…

CentOS环境变量配置+解析

环境变量的作用就是让系统快速通过你的命令找到你的可执行程序&#xff0c;windows系统里也同理&#xff0c;也就是你每次输入个命令&#xff0c;系统就会找环境变量里到底有没有叫这个命令进程的 一、环境变量配置 1.编辑配置文件 vim /etc/profile export PATH$PATH:$JAVA…

einops测试

文章目录 1. einops2. code3. pytorch 1. einops einops 主要是通过爱因斯坦标记法来处理张量矩阵的库&#xff0c;让矩阵处理上非常简单。 conda : conda install conda-forge::einopspython: 2. code import torch import torch.nn as nn import torch.nn.functional as…

Unity教程(二十一)技能系统 基础部分

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

Docker:Docker从入门到精通(一)- Docker简介

一、前言 通过本专栏的学习&#xff0c;我们将了解   1. 掌握Docker基础知识&#xff0c;能够理解Docker镜像与容器的概念   2. 完成Docker安装与启动   3. 掌握Docker镜像与容器相关命令   4. 掌握Tomcat Nginx 等软件的常用应用的安装   5. 掌握docker迁移与备份相…