七、Linux Shell 与脚本基础

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: 别再一遍遍地敲重复的命令了,把它们写进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 销毁,设置的环境变量也就随之消失了。

目录
相关文章
|
8天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1196 4
|
7天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1036 48
|
6天前
|
机器学习/深度学习 物联网
Wan2.2再次开源数字人:Animate-14B!一键实现电影角色替换和动作驱动
今天,通义万相的视频生成模型又又又开源了!Wan2.2系列模型家族新增数字人成员Wan2.2-Animate-14B。
554 11
|
17天前
|
人工智能 运维 安全
|
8天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1640 12
|
1天前
|
资源调度
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
211 127
|
8天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
341 0
|
8天前
|
消息中间件 Java Apache
SpringBoot集成RocketMq
RocketMQ 是一款开源的分布式消息中间件,采用纯 Java 编写,支持事务消息、顺序消息、批量消息、定时消息及消息回溯等功能。其优势包括去除对 ZooKeeper 的依赖、支持异步和同步刷盘、高吞吐量及消息过滤等特性。RocketMQ 具备高可用性和高可靠性,适用于大规模分布式系统,能有效保障消息传输的一致性和顺序性。
476 2