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。

我的开源项目

相关推荐
凯新生物5 小时前
聚乙二醇二生物素,Biotin-PEG-Biotin在生物检测中的应用
scala·bash·laravel·perl
一勺菠萝丶12 小时前
执行 install.sh 报错 `env: ‘bash\r‘: No such file or directory` 怎么解决?
开发语言·bash
Alaia.13 小时前
【T级别数据迁移】Oracle 数据库迁移操作手册(oracle-migrate-bash)
数据库·oracle·bash
李斯维14 小时前
第14 章 使用 shell:初始化文件
linux·bash·unix
BullSmall2 天前
Shell脚本波浪号避坑指南
linux·bash
顾安r2 天前
12.15 脚本网页 bash内建命令
java·前端·javascript·html·bash
_OP_CHEN2 天前
【Linux系统编程】(十五)揭秘 Linux 环境变量:从底层原理到实战操作,一篇吃透命令行参数与全局变量!
linux·运维·操作系统·bash·进程·环境变量·命令行参数
jimy12 天前
bash “ if <command>; then”语句,<command>返回0,then后面语句才执行
开发语言·bash
ricky_fan5 天前
(25年12月)claude code报错:might not be available in your country
macos·bash
nono牛5 天前
完整bash语法教程:从零到专家
开发语言·chrome·bash