【Linux系列】SH 与 BASH 的区别:深入解析与使用案例

2024-08-25 07:12

本文主要是介绍【Linux系列】SH 与 BASH 的区别:深入解析与使用案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

      • 1. 历史与起源
      • 2. 兼容性
      • 3. 功能差异
      • 4. 使用案例
      • 5. 总结

在 Unix 和 Linux 操作系统中,Shell 脚本是一种强大的工具,用于自动化任务和简化日常操作。Shell 脚本的核心是 Shell,它是一种命令行解释器,用于执行用户输入的命令。在众多 Shell 中,sh(Bourne Shell)和bash(Bourne Again Shell)是两种非常流行的选择。尽管它们在功能上有很多相似之处,但它们之间也存在一些关键的区别。
在这里插入图片描述

1. 历史与起源

  • Bourne Shell (sh)
    sh,即 Bourne Shell,是由 Stephen Bourne 在 1977 年开发的。它是最早的 UNIX Shell 之一,对后来的 Shell 设计产生了深远的影响。sh的设计目标是简单、高效,并且易于学习。

  • Bourne Again Shell (bash)
    bash,即 Bourne Again Shell,由 Brian Fox 在 1987 年开发,作为 GNU 项目的一部分。bash旨在成为sh的一个自由软件替代品,同时提供更多的功能和改进。bash不仅完全兼容sh,还增加了诸如命令补全、命令历史、shell 脚本调试等高级功能。

2. 兼容性

  • sh
    由于sh是最早的 Shell 之一,它的语法和功能被广泛地用于各种 UNIX 和类 UNIX 系统。然而,由于它的设计目标是简单和高效,sh的功能相对较少,不支持一些高级特性。

  • bash
    bash完全兼容sh,这意味着任何在sh中有效的脚本在bash中也应该有效。此外,bash还支持许多扩展功能,这些功能在sh中不可用。这使得bash在功能上更加强大和灵活。

3. 功能差异

  • 命令历史与补全
    bash支持命令历史和自动补全功能,这使得用户可以轻松地重复之前的命令或快速输入命令。sh不支持这些功能。

  • 脚本调试
    bash提供了一些内置的调试工具,如set -x(用于在执行时显示命令)和set -e(在命令失败时停止脚本执行)。sh没有这些工具。

  • 算术扩展
    bash支持更复杂的算术运算,包括使用let命令或$(( expression ))语法。sh的算术运算相对简单。

  • 循环和条件语句
    bash提供了更复杂的循环和条件语句,如until循环和[[ ... ]]条件表达式。sh的循环和条件语句较为基础。

4. 使用案例

  • 案例 1:简单的文件备份脚本
    sh中,一个简单的文件备份脚本可能如下所示:

    #!/bin/sh
    cp /path/to/source /path/to/backup
    

    bash中,同样的脚本可以添加一些额外的功能,如错误检查:

    #!/bin/bash
    cp /path/to/source /path/to/backup || { echo "备份失败"; exit 1; }
    
  • 案例 2:使用循环和条件语句
    bash中,你可以使用更复杂的循环和条件语句来处理文件:

    #!/bin/bash
    for file in /path/to/directory/*; doif [ -f "$file" ]; thenecho "处理文件:$file"# 处理文件的命令fi
    done
    

    sh中,这样的脚本可能需要更多的工作来实现相同的功能。

  • 案例 3:使用命令历史和补全
    bash的命令历史和补全功能可以极大地提高效率。例如,用户可以通过按Ctrl+R来搜索并重复之前的命令。
    在这里插入图片描述

5. 总结

shbash都是强大的 Shell,但它们在功能和设计上有所不同。sh以其简单性和兼容性而闻名,而bash则提供了更多的功能和灵活性。选择哪种 Shell 取决于你的具体需求和偏好。如果你需要一个简单且兼容性强的 Shell,sh可能是一个好选择。如果你需要更多的功能和灵活性,bash可能是更好的选择。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

这篇关于【Linux系列】SH 与 BASH 的区别:深入解析与使用案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104891

相关文章

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)