【Linux入门】Shell 与第一个 Shell 脚本:认识命令行解释器,写出 Hello World

文章目录

  • [一、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
相关推荐
2601_962218471 小时前
万象生鲜系统智能报表引擎技术为生鲜企业提供数字化经营分析能力
大数据·运维·微服务·云原生·架构
网硕互联的小客服1 小时前
反向路径过滤(rp_filter)是什么?多网卡服务器配置详解
运维·服务器·网络
GPFyes2 小时前
科东隔离传输失败E文本校验错误
运维·服务器·网络
是程不是序2 小时前
信创终端安全管理怎么落地?纳管、控权、护数据三段走
运维·网络·安全·电脑·系统安全
服务器硬件项目经理2 小时前
第14篇_服务器主板上MOSFET的三大应用
运维·服务器·人工智能·单片机·硬件工程·硬件
科技研学社2 小时前
无纺布贴身制品非标自动化落地复盘:一次性内裤产线的工程难点与解决方案
运维·自动化
爱学堂IT课程大全2 小时前
零基础,Hermes Agent 多场景自动化实战
运维·人工智能·自动化
朽棘不雕2 小时前
动态库的理解
linux
Escalating_xu2 小时前
【mmap 进程间通信】从共享内存到跨进程唤醒:用互斥锁、条件变量控制多个进程
java·linux·开发语言·jvm