SH 和 BASH 有什么不同 ?

当谈到 shell 脚本编写时,经常出现两个突出的 shell,Bourne shell (SH) 和 Bourne Again shell

(Bash)。两者都是基于 unix 和 linux 的系统的组成部分,提供与操作系统交互的接口。本文旨在深入研究这两种 shell 之间的复杂差异,揭示它们的独特特征,并提供比较分析,以帮助您了解何时以及为什么使用其中一种。

SH 和 Bash 简介

Bourne shell (SH) 是在 20 世纪 70 年代作为 Unix 的主要 shell 引入的。贝尔实验室的 Stephen
Bourne
开发了它,因此得名。SH 以其简单性和可移植性而闻名。当创建可能在各种 Unix 衍生产品上执行的脚本时,它是一个可靠的选择。

Bourne Again shell (Bash) 它是原始 SH 的改进版本,由 Brian Fox 为 GNU 项目开发,作为 Bourne

Shell 的自由软件替代品。Bash 是许多 Linux 发行版和 macOS 的默认 shell。它包含了 KornShell (ksh) 和 C shell (csh) 等其他 shell 的特性,提供了更健壮的功能和脚本功能。

SH 和 Bash 的主要区别

(1) Syntax Differences

与 SH 相比,Bash 提供了更多的简写和增强的脚本语法。例如:在 Bash 中,您可以使用双方括号语法 [[ ]] 进行测试,它比 SH 中使用的单方括号语法 [ ] 更健壮和安全。

SH Syntax:

复制代码
if [ $a -lt $b ]; then
    echo "$a is less than $b"
fi

Bash Syntax:

复制代码
if [[ $a -lt $b ]]; then
    echo "$a is less than $b"
fi

(2) Array Variables

Bash 支持数组变量,而 SH 不支持。当您需要处理存储在单个变量名称下的多个值时,数组非常有用。

Bash Syntax:

复制代码
array=("apple" "banana" "cherry")
echo ${array[1]}  # Outputs "banana"

(3) Command Line Editing

Bash 支持命令行编辑,而这在 SH 中不是标准的。在 Bash 中,您可以使用箭头键导航命令历史,使用退格键删除文本,并使用制表符补全文件名和命令名。

(4) Shell Options

与 SH 相比,Bash 提供了额外的 shell 选项。例如:Bash 中的 shopt 命令提供了更改其他 shell 可选行为的能力,这在 SH 中是不可用的。

(5) Process Substitution

Bash 支持进程替换 (<(command) 和 >(command)),允许使用文件名引用进程的输入或输出。这个特性在 SH 中不可用。

Bash Syntax:

复制代码
diff <(command1) <(command2)

(6) Command not found Hook

Bash 有一个特殊的 shell 函数 command_not_found_handle,当命令未找到时执行该句柄。这个特性在 SH 中不可用。

(7) Here Strings

Bash 支持"Here Strings",I/O 重定向的一种形式,允许将字符串用作由 <<< 表示的命令的输入,此功能在 SH 中不可用。

Bash Syntax

复制代码
wc -l <<< "This is a string"

选择 SH 还是 Bash

如果您正在创建一个需要在各种 Unix 系统上运行的脚本,由于其可移植性和兼容性,SH 可能是更好的选择。但是,如果您在 Linux 或 macOS 系统上工作,并且需要额外的特性和语法增强,Bash 是首选 shell。

我的开源项目

相关推荐
雪域迷影11 小时前
MacOS中配置完环境变量后执行source ~/.bash_profile后,只能在当前shell窗口中生效
macos·bash
vortex51 天前
Bash中因数值比较引发的提权漏洞:数组注入与任意命令执行
linux·开发语言·安全·网络安全·渗透测试·bash
电星托马斯1 天前
Linux如何设置bash为默认shell
linux·运维·服务器·笔记·程序人生·bash·个人开发
Billy Qin2 天前
Shell四种配置文件的区别(~/.bashrc ~/.bash_profile ~/.zshrc ~/.profile)
开发语言·bash
nlog3n2 天前
Java策略模式详解
java·bash·策略模式
大乔乔布斯4 天前
AttributeError: module ‘smtplib‘ has no attribute ‘SMTP_SSL‘ 解决方法
python·bash·ssl
阳光_你好5 天前
解决用git bash终端 tail -f 命令查看日志中文乱码问题
开发语言·git·bash
知忆_IS9 天前
【问题解决】Linux安装conda修改~/.bashrc配置文件后,root 用户下显示 -bash-4.2#
linux·conda·bash
Silber 甜10 天前
MacOS bash&zsh 命令行自动推荐补全工具
开发语言·macos·bash