前言

经常听到 “Shell脚本”、“Shell编程”、“Bash命令”,那么什么是 Shell 呢?Shell 和 Bash 有什么关系呢?我们一起来学习下吧!

Shell 是什么

Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以使用Shell来启动、挂起、停止甚至编写一些程序。更简单的来说,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。

image-20211107180100470

Shell还是一个功能相当强大的编程语言,易于编写和调试,灵活性较强。它支持变量、条件判断、循环操作等语法,所以用户可以用 Shell 命令写出各种小程序,又称为脚本(script)。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux命令

Shell的分类

Shell 有很多种,只要能给用户提供命令行环境的程序,都可以看作是 Shell。

  • Bourne Shell(sh)
  • Bourne Again shell(Bash)
  • C Shell(csh)
  • TENEX C Shell(tcsh)
  • Korn shell(ksh)
  • Z Shell(zsh)
  • Friendly Interactive Shell(fish)

Bash 与 sh 兼容,现在使用的大部分 Linux 就是使用 Bash 作为用户的 Shell,即用户登录后的默认 Shell 就是 Bash 。因此,我们可以把 Bash 与 Shell 看作同义词。

查看支持的Shell

可以通过查看 /etc/shells 文件,查看当前Linux支持的 Shell 种类。

1
2
3
4
5
6
7
8
9
[root@VM-0-5-centos ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

可以通过执行命令,切换到Linux支持的其他 shell 中,输入 exit 可以退出。

1
2
3
4
5
6
[root@VM-0-5-centos ~]# sh
sh-4.2# ls /opt
movie  redis-6.2.4  redis-6.2.4.tar.gz	rh
sh-4.2# exit
exit
[root@VM-0-5-centos ~]#

执行 echo $SHELL 命令,可以查看当前的Shell。

1
2
[root@VM-0-5-centos ~]# echo $SHELL
/bin/bash

编写第一个Shell脚本

虽然Linux不区分文件后缀名,但是我们在编写脚本的时候,习惯将文件后缀名设置为 .sh,这样使用某些编辑器打开时,会有颜色提示,方便编写脚本。

  1. 编写Shell脚本
1
2
3
4
5
6
7
8
# 1. 新建 hello_world.sh 文件
vim hello_world.sh

# 2. 在文件中输入以下内容保存

#!/bin/bash
# Author: lifelmy
echo "hello world"

脚本文件中,第一行 #!/bin/bash 中的 #! 用来指定使用哪一种 Shell,这是一种标准,不可省略;

除了第一行的 #! 之外,在脚本文件中,以 “#” 开头的均表示注释,比如我在第二行使用注释说明了脚本文件的作者;

第三行调用了Shell命令 echo ,用于打印出 “hello world” 字符串

  1. 执行脚本

有两种方式可以运行脚本:

  1. 添加可执行权限,直接运行

Linux中新建的文件默认是没有可执行权限的,因此如果我们想执行这个脚本,就需要给它添加可执行权限。权限操作我们在之前的文章中已经学习过了,如果忘记的小伙伴可以去复习下。

1
2
3
4
# 添加可执行权限,使用 chmod a+x 或者 chmod 755
[root@VM-0-5-centos ~]# chmod a+x hello_world.sh
[root@VM-0-5-centos ~]# ls -l hello_world.sh
-rwxr-xr-x 1 root root 49 11月  7 18:16 hello_world.sh

注意,如果使用这种方式在Linux中执行脚本,必须使用绝对路径或者相对路径来指定文件

1
2
3
4
5
6
7
# 使用相对路径的方式执行
[root@VM-0-5-centos ~]# ./hello_world.sh
hello world

# 直接输入文件名,会提示未找到命令
[root@VM-0-5-centos ~]# hello_world.sh
-bash: hello_world.sh: 未找到命令
  1. 使用解释器执行
1
2
[root@VM-0-5-centos ~]# bash hello_world.sh
hello world

使用这种方式执行,不需要在脚本第一行指定解释器信息,即不需要写 #!/bin/bash,因为你已经执行了解释器;同时也不需要添加可执行权限。

虽然第二种方式看起来比较简单,但是平时使用最多的还是第一种方式,不推荐第二种方式。

总结

本文介绍了 Shell 的基础知识,解释了 Bash 与 Shell 的关系,并编写了一个简单的Shell脚本,之后我们就可以开始学习Bash了。

更多

微信公众号:CodePlayer