shell编程系列- bash和sh的区别

文章目录

  • 引言
  • bash和sh的区别
    • CentOS下的区别
    • Ubuntu下的区别
  • 最佳实践

引言

我们在编写shell脚本时,通常第一行都要声明当前脚本的执行程序,也就是常见的 #!/bin/sh 或者是 #!/bin/bash ,我们无论用哪一个脚本似乎都可以正常的执行,那具体有什么区别呢,我们接下来会详细的讲一下。

bash和sh的区别

在大多数的Linux系统里, #!/bin/sh#!/bin/bash 其实就是完全相同的,但是在另外一些Linux系统中两者还是存在不小的区别,这主要是因为Linux系统发展的历史原因导致的,因为Linux操作系统在最近几十年的发展中,逐步分化为不同的发行版,在Redhat和CentOS里两者是相同的,但是在Ubuntu和Debian系统中两者有区别。

CentOS下的区别

首先我们一起看一下CentOS中两者区别,如下图:
在这里插入图片描述
可以看到 /bin/sh 是一个软连接(可以简单的理解为window里的快捷方式)指向了/bin/bash 所以两者本身就是同一个shell,没有任何区别

Ubuntu下的区别

我们在一起看看Ubuntu中两者的区别,如下图:
在这里插入图片描述
可以看到 /bin/sh 通过软连接指向了dash 这是Ubuntu提供的一个轻量级的shell,他比bash shell要少一些特性,所以在Ubuntu的系统中,如果我们使用#!/bin/sh来解释执行我们的脚本,可能就会出现一个诡异的问题。
我举个例子,有如下脚本:
shell编程系列- bash和sh的区别_第1张图片

脚本的内容很简单就是声明一个数组,然后遍历打印,注意我们此时用的是 #!/bin/sh ,我们执行一下看看结果,报错了如下图:
在这里插入图片描述
报错的原因是语法错误,这是因为在dash shell中不允许我们直接定义数组。
但是如果我们换为bash shell来解释执行脚本,我们可以看一下效果,脚本内容如下:
shell编程系列- bash和sh的区别_第2张图片
脚本可以正常执行,如下图:
在这里插入图片描述

最佳实践

先说结论,shell脚本中建议使用 #!/bin/bash
上面讲了两种shell的区别,我们可以发现使用bash shell 其实可以避免一些诡异的问题,并且bash shell 也是所有linux发行版中都带有的shell,因此在我们的shell脚本中为了保证脚本在各个linux平台上都可以稳定运行,建议使用 #!/bin/bash

你可能感兴趣的:(shell编程,linux,bash,linux,shell编程)