七、Linux Shell 与脚本基础

我们这次讲解Shell的核心概念,以及如何创建、配置和执行脚本,这是从手动命令到自动化运维的关键

思维导图

一、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:

bash 复制代码
echo $SHELL

3. Shell 与 Shell 脚本的区别

  • Shell (交互式): 直接在终端 输入命令并立即获得结果的环境。
bash 复制代码
ls -l
pwd
  • Shell 脚本 (非交互式): 一个包含一系列命令文本文件 ,用于一次性执行 以实现自动化
bash 复制代码
# 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. 添加执行权限:

bash 复制代码
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:

bash 复制代码
echo $SHELL

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

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

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

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

13. 标准文件头注释:

bash 复制代码
#!/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 销毁,设置的环境变量也就随之消失了。

相关推荐
thinkMoreAndDoMore1 小时前
linux内核匹配I2C设备
linux·运维·服务器
小政同学7 小时前
【NFS故障】共享的文件无法执行
linux·运维·服务器
AI木马人7 小时前
3.【Prompt工程实战】如何设计一个可复用的Prompt系统?(避免每次手写提示词)
linux·服务器·人工智能·深度学习·prompt
ch3nyuyu7 小时前
Ubuntu(乌班图)基础指令
linux·运维·网络
minglie18 小时前
gcc编译器汇总
linux
白菜欣9 小时前
Linux —《开发三件套:gcc/g++、gdb、make/Makefile 全解析》
linux·运维
senijusene10 小时前
基于 imx6ull平台按键驱动开发:input子系统+中断子系统+platform总线
linux·驱动开发
莎士比亚的文学花园10 小时前
Linux驱动开发(1)——系统移植
linux·运维·服务器
PH = 710 小时前
OverlayFS联合文件系统使用示例
java·linux·服务器
AC赳赳老秦10 小时前
OpenClaw进阶技巧:批量修改文件内容、替换关键词,解放双手
java·linux·人工智能·python·算法·测试用例·openclaw