文章目录
- [一、Shell 是什么](#一、Shell 是什么)
- [二、Linux 提供的 Shell 解析器](#二、Linux 提供的 Shell 解析器)
- [三、bash 和 sh 的关系](#三、bash 和 sh 的关系)
- [四、CentOS 默认解析器是 bash](#四、CentOS 默认解析器是 bash)
- [五、Shell 脚本入门](#五、Shell 脚本入门)
-
- [1. 脚本格式](#1. 脚本格式)
- [2. 第一个脚本:输出 hello shell](#2. 第一个脚本:输出 hello shell)
- [3. 脚本的常用执行方式](#3. 脚本的常用执行方式)
- 六、总结
无论是运维、后端开发还是大数据方向,Shell 都是 Linux 下绕不开的第一课。本文带你从"Shell 是什么"讲起,手把手写出并运行你的第一个 Shell 脚本。
一、Shell 是什么
Shell 是一个命令行解释器(Command Interpreter),它接收应用程序 / 用户的命令,然后调用操作系统内核去完成具体工作。
用户 / 应用程序
│ 输入命令
▼
Shell(命令行解释器)
│ 调用系统调用
▼
操作系统内核(Kernel)
│
▼
硬件
同时,Shell 还是一门功能相当强大的编程语言------易编写、易调试、灵活性强,可以用来编写自动化脚本完成批量任务。
二、Linux 提供的 Shell 解析器
Linux 系统自带多种 Shell,可以使用 cat /etc/shells 查看系统当前支持的合法登录 Shell(/etc/shells 文件记录了系统中所有可用的 Shell 路径):
shell
cat /etc/shells
常见的解析器有:
shell
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
补充 :除了上面这些,常见的还有
/bin/zsh(macOS 从 Catalina 版本起默认使用 zsh)。其中 bash 兼容 sh,且功能更强大,是目前绝大多数 Linux 发行版的默认 Shell。
三、bash 和 sh 的关系
在 CentOS/RHEL 等系统中,/bin/sh 其实是指向 /bin/bash 的符号链接 ,也就是说 sh 本质上就是 bash。可以用以下命令验证:
shell
cd /bin
ll | grep bash
输出中可以看到 sh -> bash 的软链接关系。也可以使用 which bash 查看 bash 命令的具体路径:
shell
which bash
# /usr/bin/bash
四、CentOS 默认解析器是 bash
在终端中查看当前用户默认使用的 Shell:
shell
[root@node1 bin]# echo $SHELL
/bin/bash
补充 :
$SHELL是系统预定义的环境变量,记录当前用户默认的 Shell。此外,/etc/passwd文件中每行最后一个字段,也记录了该用户登录后使用的默认 Shell。
五、Shell 脚本入门
1. 脚本格式
脚本以 #!/bin/bash 开头,这一行称为 shebang,用于指定脚本由哪个解析器来执行:
shell
脚本以 #!/bin/bash 开头(指定解析器)
2. 第一个脚本:输出 hello shell
shell
# 创建脚本文件
touch hello.sh
# 编辑脚本
vim hello.sh
在 hello.sh 中添加以下内容:
shell
#!/bin/bash
echo "hello shell"
3. 脚本的常用执行方式
方式一:采用 bash 或 sh + 脚本的相对路径/绝对路径(无需赋予 +x 执行权限)
shell
# sh + 相对路径
sh ./hello.sh
# sh + 绝对路径
sh /root/hello.sh
# bash + 相对路径
bash ./hello.sh
# bash + 绝对路径
bash /root/hello.sh
方式二:直接输入脚本的相对路径或绝对路径执行(必须具有可执行权限 +x)
shell
# 首先赋予 hello.sh 脚本 +x 权限
chmod +x hello.sh
# 相对路径执行
./hello.sh
# 绝对路径执行
/root/hello.sh
方式三:在脚本路径前加上 . 或使用 source(了解)
shell
# 创建一个脚本 test.sh,内容如下:
#!/bin/bash
a=6
echo $a
分别用不同方式执行,观察区别:
shell
bash test.sh # 子 shell 中执行,父 shell 中 echo $a 无输出
sh test.sh
chmod +x test.sh
./test.sh
. test.sh # 当前 shell 中执行,父 shell 中 echo $a 有输出
source test.sh # 与 . 等价
三种方式的对比总结:
| 执行方式 | 示例命令 | 是否需要执行权限 | 执行环境 |
|---|---|---|---|
| 方式一 | bash ./hello.sh / sh /root/hello.sh |
不需要(需读权限) | 子 Shell |
| 方式二 | ./hello.sh / /root/hello.sh |
需要 chmod +x |
子 Shell |
| 方式三 | . ./hello.sh / source ./hello.sh |
不需要(需读权限) | 当前 Shell |
为什么?
- 前两种方式都是在当前 Shell 中打开一个子 Shell 来执行脚本内容,当脚本内容执行结束,子 Shell 关闭,回到父 Shell 中。
- 第三种方式(
.或source)可以使脚本内容在当前 Shell 里执行,而无需打开子 Shell。 - 开子 Shell 与不开子 Shell 的区别,就在于环境变量的继承关系:在子 Shell 中设置的变量,父 Shell 是不可见的。
这也是为什么每次修改完 /etc/profile 文件以后,需要 source /etc/profile 一下------只有这样才能让环境变量改动立即生效于当前 Shell。
六、总结
| 知识点 | 要点 |
|---|---|
| Shell 是什么 | 命令行解释器 + 编程语言 |
| 查看可用 Shell | cat /etc/shells |
| 默认解析器 | bash(echo $SHELL 验证) |
| 脚本开头 | #!/bin/bash |
| 三种执行方式 | bash/sh、直接执行(+x)、. / source |
| 子 Shell 影响 | 子 Shell 中的变量不会影响父 Shell |