当前位置: 首页 > 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
    

相关文章:

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

sh 与 bash 的区别详解 1. 历史背景 sh (Bourne Shell)&#xff1a; 由 Stephen Bourne 在 1977 年开发&#xff0c;是 Unix 系统的默认 Shell。语法简洁&#xff0c;但功能有限。 bash (Bourne Again Shell)&#xff1a; 由 Brian Fox 在 1989 年开发&#xff0c;是 sh 的扩…...

*PyCharm 安装教程

PyCharm 安装教程&#xff0c;适用于 Windows、macOS 和 Linux 系统&#xff1a; 1. 下载 PyCharm 官网地址&#xff1a;https://www.jetbrains.com/pycharm/版本选择&#xff1a; Community&#xff08;社区版&#xff09;&#xff1a;免费&#xff0c;适合基础 Python 开发…...

[特殊字符] Elasticsearch 双剑合璧:HTTP API 与 Java API 实战整合指南

&#x1f680; Elasticsearch 双剑合璧&#xff1a;HTTP API 与 Java API 实战整合指南 一、HTTP API 定义与用途 Elasticsearch 的 HTTP API 是基于 RESTful 接口设计的核心交互方式&#xff0c;支持通过 URL 和 JSON 数据直接操作索引、文档、集群等资源。适用于快速调试、…...

网络和操作系统基础篇

网络和操作系统基础篇 TCP三次握手 客户端——发送带有SYN标志的数据包——服务端一次握手Client进入syn_sent状态&#xff1b;服务端——发送带有SYN/ACK标志的数据包——客户端二次握手服务端进入syn_rcvd&#xff1b;客户端——发送带有ACK标志的数据包——服务端三次握手…...

Oracle 连接报错:“ORA-12541:TNS:no listener ”,服务组件中找不到监听服务

一、 报错&#xff1a; navicat连接数据库报错&#xff1a;ORA-12541&#xff1a;TNS:no listener 二、排查问题 三、 解决问题 删除Oracle安装目录下选中的配置&#xff1a;listener.ora 及 listener*.bak相关的 cmd&#xff0c;用管理员打开 执行&#xff1a;netca 命…...

内外网文件传输 安全、可控、便捷的跨网数据传输方案

一、背景与痛点 在内外网隔离的企业网络环境中&#xff0c;员工与外部协作伙伴&#xff08;如钉钉用户&#xff09;的文件传输面临以下挑战&#xff1a; 安全性风险&#xff1a;内外网直连可能导致病毒传播、数据泄露。 操作繁琐&#xff1a;传统方式需频繁切换网络环境&…...

基于Flask的租房信息可视化系统的设计与实现

【Flask】基于Flask的租房信息可视化系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 随着互联网的快速发展&#xff0c;租房市场日益繁荣&#xff0c;信息量急剧增加&#xff…...

《Keras 2 :使用 RetinaNet 进行对象检测》:此文为AI自动翻译

《Keras 2 :使用 RetinaNet 进行对象检测》 作者:Srihari Humbarwadi 创建日期:2020/05/17 最后修改日期:2023/07/10 描述:实施 RetinaNet:用于密集对象检测的焦点损失。 (i) 此示例使用 Keras 2 在 Colab 中查看 • 介绍 目标检测是计算机中非常重要的问题 视觉。在…...

【Erdas实验教程】010:监督分类及后处理、精度评价

文章目录 一、监督分类介绍二、监督分类流程1. 定义分类模板2. 评价分类模板3. 执行监督分类4. 评价分类结果4.1 叠加显示4.2 动态窗口链接4.3 阈值处理4.4 分类精度评价5. 分类后处理5.1 集聚处理5.2 滤网分析5.3 去除分析5.4 重编码一、监督分类介绍 遥感图像计算机分类的依…...

Moonshot AI 新突破:MoBA 为大语言模型长文本处理提效论文速读

前言 在自然语言处理领域&#xff0c;随着大语言模型&#xff08;LLMs&#xff09;不断拓展其阅读、理解和生成文本的能力&#xff0c;如何高效处理长文本成为一项关键挑战。近日&#xff0c;Moonshot AI Research 联合清华大学、浙江大学的研究人员提出了一种创新方法 —— 混…...

【Python量化金融实战】-第1章:Python量化金融概述:1.2 Python在量化金融中的优势与生态

本小节学习建议&#xff1a;Python在量化金融领域的统治地位不仅体现在当前的技术栈中&#xff0c;更在于其持续进化的能力。随着AI、区块链等新技术的融合&#xff0c;Python开发者将始终处于金融创新的最前沿。建议学习者从构建完整的策略生产线开始&#xff0c;逐步深入高频…...

react路由总结

目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…...

edge浏览器将书签栏顶部显示

追求效果&#xff0c;感觉有点丑&#xff0c;但总归方便多了 操作路径&#xff1a;设置-外观-显示收藏夹栏-始终...

AIGC-Stable Diffusion模型介绍

Stable Diffusion模型介绍 Stable Diffusion模型介绍模型架构Stable Diffusion模型特点 模型原理扩散过程 代码示例 Stable Diffusion模型介绍 Stable Diffusion是一种基于深度学习的图像生成模型&#xff0c;特别适用于生成高质量的图像。它利用扩散模型&#xff08;diffusio…...

【算法】游艇租贷

问题 ⻓江游艇俱乐部在⻓江上设置了 n 个游艇租聘站&#xff0c;游客可以在这些租聘站租 ⽤游艇&#xff0c;然后在下游的任何⼀个租聘站归还。游艇出租站 i 到 j 的租⾦为 r(i, j)&#xff0c;1 ≤i< j≤n&#xff0c;设计⼀个算法&#xff0c;计算从出租站 i 到 j 所需的…...

科普:Docker run的相关事项

一、镜像名&#xff08;含标签&#xff09;太长 如&#xff0c;通过如下命令行&#xff1a; docker pull designthru2019/dify:56c6d1af0944dbdb5e0115cb623ff0e118a4ac62拉取的镜像名&#xff08;及标签&#xff09;太长&#xff0c;可以通过改名的方法变短。 在 Docker 中&…...

Ryu:轻量开源,开启 SDN 新程

1. Ryu 控制器概述 定位&#xff1a;轻量级、开源的SDN控制器&#xff0c;专为开发者和研究人员设计&#xff0c;基于Python实现。开发者&#xff1a;由日本NTT实验室主导开发&#xff0c;遵循Apache 2.0开源协议。核心理念&#xff1a;简化SDN应用开发&#xff0c;提供友好的…...

Python游戏编程之赛车游戏6-2

3.2 move()方法的定义 Player类的move()方法用于玩家控制汽车左右移动&#xff0c;当玩家点击键盘上的左右按键时&#xff0c;汽车会相应地进行左右移动。 move()方法的代码如图7所示。 图7 move()方法的代码 其中&#xff0c;第20行代码通过pygame.key.get_pressed()函数获…...

IDEA + 通义灵码AI程序员:快速构建DDD后端工程模板

作者&#xff1a;陈荣健 IDEA 通义灵码AI程序员&#xff1a;快速构建DDD后端工程模板 在软件开发过程中&#xff0c;一个清晰、可维护、可扩展的架构至关重要。领域驱动设计 (DDD) 是一种软件开发方法&#xff0c;它强调将软件模型与业务领域紧密结合&#xff0c;从而构建更…...

libwebsockets交叉编译全流程

libwebsocket中的webscoket加密功能需要依赖于Openssl库因此需要提前准备好openssl开源库。 交叉编译openssl 下面演示源码方式交叉编译OpenSSL为动态库。 创建个Websocket文件夹&#xff0c;把后续的成果物均放在这个文件中&#xff0c;文件夹中创建子文件夹OpenSSL和libWeb…...

告别CDD依赖:手把手教你用CANoe OSEK_TP.dll动态配置ISO 15765-2流控参数

动态配置ISO 15765-2流控参数的工程实践指南 在汽车电子开发领域&#xff0c;诊断协议栈的底层控制能力直接决定了测试效率和问题定位精度。传统依赖CDD文件的配置方式如同"黑箱操作"&#xff0c;工程师面对通信异常时往往束手无策。本文将揭示如何通过CANoe的OSEK_T…...

小公司也能有“官网”!5步教你用微信小程序+PHP后台低成本搭建企业展示系统

小微企业零基础搭建微信小程序官网实战指南 在数字化浪潮中&#xff0c;企业官网早已从奢侈品变为必需品。但对于预算有限的小微企业来说&#xff0c;动辄数万元的定制开发费用和复杂的运维流程往往让人望而却步。微信小程序的出现彻底改变了这一局面——无需下载安装、即用即…...

服务器该如何防范网络攻击?

服务器作为网络系统的核心枢纽&#xff0c;存储着大量关键数据并支撑着各类业务运行&#xff0c;一旦遭受网络攻击&#xff0c;可能导致数据泄露、服务中断等严重后果。防火墙是服务器网络安全的第一道防线&#xff0c;它可以根据预设的规则&#xff0c;对进出网络的数据包进行…...

我的模型总在测试集上翻车?可能是数据增强的‘姿势’不对!避坑指南与场景化策略

模型泛化困境突围&#xff1a;数据增强的精准应用与场景化避坑指南 当你的模型在训练集上表现优异&#xff0c;却在测试集上频频"翻车"时&#xff0c;问题可能出在数据增强这一关键环节。数据增强本应是提升模型泛化能力的利器&#xff0c;但不当使用反而会成为引入噪…...

告别uboot启动失败:深入解析i.MX6平台SD卡检测(CD)引脚的配置与调试

告别uboot启动失败&#xff1a;深入解析i.MX6平台SD卡检测(CD)引脚的配置与调试 在嵌入式Linux开发中&#xff0c;SD卡作为常见的启动和存储介质&#xff0c;其稳定性和可靠性直接影响整个系统的运行。然而&#xff0c;许多开发者在使用i.MX6系列处理器时&#xff0c;都曾遇到过…...

**发散创新:基于角色与策略的动态权限控制系统设计与实现**在现代企业级应用中,权限

发散创新&#xff1a;基于角色与策略的动态权限控制系统设计与实现 在现代企业级应用中&#xff0c;权限管理已不再是简单的“用户-角色-资源”映射&#xff0c;而是需要支持细粒度控制、运行时动态调整、多维度策略组合的复杂系统。本文将深入探讨一种融合 RBAC&#xff08;基…...

让Ouster OS1-128雷达跑通LeGO-LOAM建图:关键参数修改与‘ring‘字段报错解决

Ouster OS1-128雷达与LeGO-LOAM深度适配实战指南 当128线激光雷达遇上轻量级SLAM算法&#xff0c;会碰撞出怎样的火花&#xff1f;作为自动驾驶和机器人领域的热门硬件&#xff0c;Ouster OS1-128凭借其紧凑体积和高分辨率点云&#xff0c;正在逐步替代传统Velodyne设备。但真正…...

终极鼠标增强方案:Mac Mouse Fix让你的普通鼠标在macOS上超越苹果触控板

终极鼠标增强方案&#xff1a;Mac Mouse Fix让你的普通鼠标在macOS上超越苹果触控板 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 还在为macO…...

如何在5分钟内掌握PPTist:免费开源在线PPT制作工具的终极指南

如何在5分钟内掌握PPTist&#xff1a;免费开源在线PPT制作工具的终极指南 【免费下载链接】PPTist PowerPoint-ist&#xff08;/pauəpɔintist/&#xff09;, An online presentation application that replicates most of the commonly used features of MS PowerPoint, allo…...

WarcraftHelper深度解析:专业级魔兽争霸III兼容性与性能优化方案

WarcraftHelper深度解析&#xff1a;专业级魔兽争霸III兼容性与性能优化方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸III作为经典的即…...