七、Linux Shell 与脚本基础

本文涉及的产品
函数计算FC,每月15万CU 3个月
可观测可视化 Grafana 版,10个用户账号 1个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。

思维导图

image.png
image.png
image.png

一、Shell 简介

1. Shell 的定义与作用
Shell是命令行解释器,作为用户Linux内核交互的接口

它的工作流程

1. 接收用户输入的命令 (如 ls)

2. 解释命令

3. 调用内核执行

4. 返回执行结果给用户

2. 常见的 Shell 类型

bash (Bourne Again SHell): Linux默认Shell,功能强大,兼容sh
sh (Bourne Shell): 早期经典的Unix Shell,注重高兼容性
zsh (Z Shell): 功能比bash更强大,提供更丰富的自动补全和插件系统
ksh (Korn Shell): 融合sh和csh的特性
csh/tcsh (C Shell): 语法类似C语言

查看当前Shell:

echo $SHELL

3. Shell 与 Shell 脚本的区别

  • Shell (交互式): 直接在终端输入命令并立即获得结果的环境。
    ls -l
    pwd
    
  • Shell 脚本 (非交互式): 一个包含一系列命令文本文件,用于一次性执行以实现自动化
    # script.sh 内容:
    # #!/bin/bash
    # echo "任务开始"
    # date
    # echo "任务结束"
    

二、编写第一个 Shell 脚本

1. 脚本文件的创建与命名

  1. 使用文本编辑器 (如 vim) 创建文件
  2. 在文件中编写命令
  3. 保存文件
    命名约定: 强烈建议.sh 后缀结尾 (如 backup.sh)

2. 指定解释器

定义: 脚本文件的 第一行,格式为 #!解释器路径
作用: 告诉操作系统在 直接执行脚本时 ( ./script.sh) 使用哪个解释器
规则: 必须是文件的 绝对第一行

常见 Shebang 选项:
> #!/bin/bash:
指定使用 bash。 优点: 可用bash 扩展功能缺点: 可移植性稍差
>
> #!/bin/sh:
指定使用 sh。 优点: 更好的可移植性 (符合POSIX标准)。 缺点: 功能受限
>
> #!/usr/bin/env bash:
强烈推荐的方式。 优点: env命令会 在PATH环境变量查找bash解释器, 极大提高了脚本的 可移植性

3. 脚本的执行方式
三种主要方式:

方式一: 作为解释器的参数执行
特点: 无需执行权限。脚本在 子Shell中执行, 不影响当前Shell环境。
bash bash my_script.sh

方式二: 赋予执行权限后直接运行
第一步: 添加 执行权限(x)
bash chmod +x my_script.sh
第二步: 直接执行
bash ./my_script.sh
特点: 最标准的执行方式。Shebang 决定解释器。脚本仍在 子Shell中执行, 不影响当前Shell环境。

方式三: 使用 source. 命令
特点: 无需执行权限 (只需 读权限)。脚本在 当前Shell环境中执行,因此会 影响当前环境 (如设置变量、定义函数)。
bash source my_script.sh # 或 . my_script.sh

执行方式对比小结:
| 执行方式 | 需执行权限(x)? | 在子Shell中执行? | 影响当前Shell? | 主要用途 |
| :--- | :--- | :--- | :--- | :--- |
| bash script.sh | | | | 运行一次性任务 |
| ./script.sh | | | | 标准执行 |
| source script.sh | (需r) | | | 加载配置/环境 |

## 三、注释与可读性

1. 单行注释
使用 # 符号。从 # 到行尾的内容 被忽略
bash # 这是一个单行注释 echo "Hello, World!" # 这也是注释

2. 多行注释的实现方式
使用 Here Document重定向给 空命令 :
bash : <<'COMMENT_BLOCK' 这是第一行注释。 这是第二行注释。 这整块内容都不会被执行。 COMMENT_BLOCK

3. 良好的注释习惯
解释“为什么”(Why),而不是“干什么”(What) 保持注释 简洁并与代码 同步
文件头注释: 在脚本开头说明用途、作者、日期、版本等。
bash #!/usr/bin/env bash # =================================================== # Script Name: backup.sh # Description: Backs up the web server data. # Author: IvanCodes # Date: 2025-08-06 # Version: 1.0 # ===================================================

## 总结
本章我们奠定了Shell脚本的基础理解了Shell的核心角色,掌握了脚本的创建、Shebang的重要性以及三种核心执行方式。良好的注释习惯编写专业脚本第一步

---

## *练习题

题目:

  1. 简述 Shell 在 Linux/Unix 系统中的主要作用是什么?
  2. Shell 脚本的第一行 #!/bin/bash 有什么作用?它通常被称为什么?
  3. 如何让一个名为 my_script.sh 的 Shell 脚本文件,能够直接通过 ./my_script.sh 的方式运行?请写出关键命令。
  4. 执行 Shell 脚本时,使用 bash script.shsource script.sh 的主要区别是什么?哪种方式会影响当前的 Shell 环境?
  5. 在 Shell 脚本中,如何添加单行注释?请给出表示注释的符号。
  6. Shell 没有原生的多行注释块语法。请描述一种常用的、基于 Here Document 的方法来模拟多行注释。
  7. 为什么通常推荐使用 #!/usr/bin/env bash 而不是直接使用 #!/bin/bash 作为 Shebang?
  8. 如果一个脚本文件 test.sh 没有执行权限,但有读权限,以下哪种方式可以成功执行它? A) ./test.sh B) bash test.sh C) source test.sh D) B和C均可
  9. 要查看当前系统默认的 Shell 是什么,应该执行什么命令?
  10. . (点号) 命令和 source 命令在执行脚本时有什么关系?
  11. 为什么在执行当前目录下的脚本时,通常需要在脚本名前加上 ./
  12. 你为一个脚本添加了 chmod +x script.sh 权限,但执行 ./script.sh 时提示 "bad interpreter: No such file or directory"。最可能的原因是什么?
  13. 写一个标准的文件头注释块,包含脚本名称、描述和作者。
  14. zshbash 都是 Shell 的一种实现,这种说法正确吗?
  15. 如果你有一个脚本 setup_env.sh,其内容是 export MY_VAR="hello"。为了在当前终端会话中设置 MY_VAR 这个环境变量,你应该使用哪种方式执行这个脚本?
答案与解析:

1. Shell 的作用:
解析: Shell 是命令行解释器,作为用户操作系统内核交互的接口或桥梁。它负责接收和解释用户的命令,调用内核执行,并返回结果

2. Shebang 的作用:
解析: #!/bin/bash 的作用是指定解释器。当脚本被直接执行时,操作系统会根据这一行找到 /bin/bash 解释器来处理脚本内容。这一行通常被称为 Shebang

3. 添加执行权限:

chmod +x my_script.sh

解析: chmod +x 命令为文件添加执行权限,这是能够直接通过 ./ 方式运行脚本的先决条件

4. bash vs source 的区别:
解析: 主要区别在于执行环境bash script.sh 会启动一个新的子 Shell 来执行脚本,不影响当前环境。source script.sh 则在当前的 Shell 环境中执行,会影响当前环境(如设置变量、定义函数)。

5. 单行注释符号:
解析: 在 Shell 脚本中,使用 # 符号来添加单行注释。

6. 模拟多行注释:
解析: 使用 Here Document 并将其重定向给一个空命令 :。例如:: <<'COMMENT' ... COMMENT

7. env 的优势:
解析: #!/usr/bin/env bash 提高了脚本的可移植性。它会在用户的PATH环境变量中查找bash,而不是硬编码/bin/bash。这使得脚本在不同系统自定义环境更容易成功运行。

8. 无执行权限的执行方式:
答案: D) B和C均可
解析: bash test.shsource test.sh 都是直接调用解释器或内建命令来读取和执行脚本内容,因此只需要对文件有读权限即可,不需要执行权限。

9. 查看默认 Shell:

echo $SHELL

解析: $SHELL 是一个环境变量,它存储了当前用户登录时使用的默认 Shell 的路径。

10. .source 的关系:
解析: 它们是等价的. (点号) 是 source 命令的简写形式,两者都用于在当前 Shell 环境中执行脚本。

11. 使用 ./ 的原因:
解析: 出于安全原因。Linux 系统默认不会在当前工作目录下搜索命令./ 明确地告诉 Shell “请在当前目录下查找并执行这个文件”,防止意外运行了与系统命令同名恶意脚本

12. "bad interpreter" 错误原因:
解析: 这个错误最常见的原因是脚本的Shebang行 (#!...) 指定了一个不存在路径错误的解释器。另一个可能的原因是脚本文件从Windows系统拷贝过来,包含了回车符 (\r),导致解释器路径 (如 /bin/bash\r) 无效。

13. 标准文件头注释:

#!/usr/bin/env bash
# ===================================================
# Script Name:   my_awesome_script.sh
# Description:   This script does awesome things.
# Author:        IvanCodes
# ===================================================

解析: 一个好的文件头注释能让任何人快速理解脚本的基本信息,是专业脚本编写标志

14. zshbash 的关系:
答案: 正确。
解析: 两者都是不同的 Shell 实现,都扮演着命令行解释器的角色,只是在功能、语法细节和用户体验上有所不同

15. 设置环境变量的执行方式:
答案: source setup_env.sh. setup_env.sh
解析: export 命令只有在当前 Shell 环境中执行时才能真正设置对当前会话生效的环境变量。如果使用 bash setup_env.shexport 会在子 Shell 中执行,脚本一结束,子 Shell 销毁,设置的环境变量也就随之消失了。

目录
相关文章
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
204 0
Linux系统初始化脚本
|
2月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
208 2
|
2月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
5月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
222 60
|
2月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
4月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
431 0
|
6月前
|
Java Linux
自定义linux脚本用于快速jar包启动、停止、重启
自定义linux脚本用于快速jar包启动、停止、重启
297 29
|
6月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
137 17
|
6月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
327 3
|
6月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
159 4