一、Shell 脚本基础

一、Shell 简介

1.Shell 的定义与作用

Shell,通常被称为命令行解释器 (Command Line Interpreter),是用户 👤 与 Linux/Unix 操作系统内核进行交互 ↔️ 的“桥梁” 🌉。它扮演着翻译官 🗣️ 的角色:

  • 接收用户输入的命令 (如 ls, cd, mkdir)。
  • 解释这些命令 🧐。
  • 调用操作系统内核执行相应的功能。
  • 将执行结果返回并显示给用户 🖥️。

简单来说,没有 Shell,我们就很难方便地直接与强大的操作系统内核打交道了!💻 (简直无法想象!)

2.常见的 Shell 类型

存在多种不同的 Shell 实现,它们在语法、功能和效率上可能有所差异 ✅:

  • bash (Bourne Again SHell): 这是目前最流行、最常用 ⭐ 的 Shell,是绝大多数 Linux 发行版的默认 Shell。它兼容 sh,并增加了许多新特性(命令历史、命令补全、作业控制等)。我们后续的脚本主要会以 bash 为基础。
  • sh (Bourne Shell): 一个早期且经典 📜 的 Unix Shell,由 Stephen Bourne 开发。许多旧的或要求高兼容性 🤝 的脚本仍会使用它。在很多系统中,/bin/sh 可能是一个指向 bash (或其他 Shell) 的符号链接,但 bash 在以 sh 模式运行时会限制某些功能以保持兼容。
  • zsh (Z Shell): 一个功能极其强大 💪 的 Shell,提供了比 bash 更丰富的功能、更强的自动补全 ✨、主题和插件系统(如 Oh My Zsh),深受许多开发者喜爱 ❤️。
  • ksh (Korn Shell): 由 David Korn 开发,试图融合 sh 的脚本能力和 C Shell 的交互特性。
  • csh/tcsh (C Shell / TENEX C Shell): 语法风格类似 C 语言,交互性较好,但脚本编写方面有时被认为不如 Bourne 系列 Shell。

小提示: 💡 你可以在终端输入 echo $SHELL 来查看你当前正在使用的 Shell 类型。

3.Shell 与 Shell 脚本的区别

这是一个非常基础重要的概念 🤔:

  • Shell (交互式): 指的是你直接在终端(命令行界面)中输入命令,按回车后立即看到执行结果的环境。这是一种你问我答式的交互方式 💬。
# 这就是在交互式 Shell 中输入命令
ls -l
pwd
  • Shell 脚本 (非交互式): 是一个文本文件 📜,里面包含了一系列按照特定顺序编写的 Shell 命令。你可以一次性执行这个脚本文件,让计算机自动完成 🤖 一系列复杂的或重复性的任务,实现自动化。这是一种批量处理的执行方式 ⚙️。
# my_script.sh 文件内容可能像这样:
# #!/bin/bash
# echo "开始执行任务..."
# mkdir temp_dir
# cd temp_dir
# echo "任务完成!"

二、 编写第一个 Shell 脚本

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

创建一个 Shell 脚本非常简单

  1. 使用文本编辑器 打开你喜欢的文本编辑器(如 vim, nano, gedit, VS Code 等)📝。
  2. 编写命令: 在文件中输入你的 Shell 命令。
  3. 保存文件 将文件保存 💾。
    • 命名约定 🏷️: 虽然不是强制性的,但强烈建议将 Shell 脚本文件以 .sh 后缀结尾(例如 my_first_script.sh, backup_data.sh)。这有助于识别文件类型 👀,并且让其他用户(以及未来的你 😅)更容易理解。📄
2.指定解释器 (Shebang)

这是 Shell 脚本中至关重要❗ 的一行! ✨

  • 什么是 Shebang? 脚本文件的第一行内容,格式为 #!解释器路径
  • 作用: 它告诉操作系统内核,当直接执行这个脚本文件时(即使用方法 2:./script.sh 方式),应该调用哪个解释器来处理文件中的命令。 注意: 如果使用方法 1 (bash script.sh) 或方法 3 (source script.sh) 执行,Shebang 行实际上会被忽略 🤷‍♀️,因为解释器已经由用户显式指定 (方法 1) 或就是当前 Shell (方法 3)。
  • 绝对要求: Shebang 行必须是脚本文件的绝对第一行,前面不能有任何字符,包括空格或空行。

常见的 Shebang 选项:

虽然 #!/bin/bash最常见的,尤其是在 Linux 环境中,但还有其他一些常用的选项,选择哪个取决于你的脚本需求和目标运行环境:

  1. #!/bin/bash:

    • 指定使用 Bourne Again Shell (bash) 来执行脚本。
    • 优点: 可以使用 bash 提供的所有扩展功能 💪(如数组、双方括号 [[ ]] 条件测试、函数等)。
    • 缺点: 如果系统没有安装 bash 或者 bash 不在 /bin/bash 路径下,脚本会执行失败 💥。依赖 bash 特性的脚本可移植性稍差
  2. #!/bin/sh:

    • 指定使用 Bourne Shell (sh) 来执行脚本。
    • 优点: 目标是编写符合 POSIX 标准 📜 的脚本,具有更好的可移植性 🌍。在很多系统中,/bin/sh 可能是一个指向 bashdash 或其他兼容 Shell 的符号链接。当 bashsh 模式被调用时,它会禁用一些 bash 特有的扩展。
    • 缺点: 不能使用 bash 等现代 Shell 的扩展语法和功能,编写复杂脚本可能更繁琐 😓。
  3. #!/usr/bin/env <interpreter> (例如 #!/usr/bin/env bash#!/usr/bin/env python):

    • 这是强烈推荐 👍 的一种方式,特别是对于需要分发 📦 的脚本。
    • env 是一个命令,它会在系统的PATH 环境变量 🗺️ 所指定的目录中查找第一个找到的 <interpreter>(如 bash, python, perl, node 等)并使用它来执行脚本。
    • 优点: 极大地提高了可移植性 🚀。不同系统或用户可能将解释器安装在不同的路径下(如 /usr/bin/bash, /usr/local/bin/bash, /opt/bin/bash)。使用 env 可以确保只要解释器在用户的 PATH 中,脚本就能找到它 👌。
    • 缺点: 相比直接指定路径,会有极其微小的额外启动开销(查找解释器)。安全性方面,如果 PATH 被恶意篡改,可能会执行非预期的解释器(但这种情况很少见且通常已有更大的安全问题 😨)。
    • 常见示例:
      • #!/usr/bin/env bash (推荐 ✅ 的 bash 脚本 Shebang)
      • #!/usr/bin/env sh (推荐 ✅ 的可移植 sh 脚本 Shebang)
      • #!/usr/bin/env python3 (用于 Python 3 脚本 🐍)
      • #!/usr/bin/env perl (用于 Perl 脚本 🐪)
      • #!/usr/bin/env node (用于 Node.js 脚本 🟢)
  4. 其他 Shell:

    • #!/bin/zsh#!/usr/bin/env zsh: 指定使用 Z Shell
    • #!/bin/ksh#!/usr/bin/env ksh: 指定使用 Korn Shell

🤔 如何选择 Shebang?

  • 如果你的脚本只在你自己控制的、确定安装了 bash 的 Linux 系统上运行,并且你需要 bash 的特性,#!/bin/bash#!/usr/bin/env bash 都可以。
  • 如果你希望脚本尽可能广泛地兼容 🌍 各种 Unix-like 系统(包括 macOS, BSD 等),并且只使用了 sh 的标准功能,那么使用 #!/bin/sh#!/usr/bin/env sh更安全、更推荐的选择 ✅。
  • 为了最大化可移植性 🚀,通常首选推荐使用 #!/usr/bin/env <interpreter> 的形式 👍。
3.脚本的执行方式

你有三种主要的方式来运行你的 Shell 脚本 ▶️:

  1. 作为解释器的参数执行:
    • 这种方式不需要给脚本文件设置执行权限 🔑。
    • 你直接调用 Shell 解释器 (如 bashsh),并将脚本文件名作为参数传递给它。
    • 优点: 简单直接,无需关心执行权限。
    • 注意: 脚本在子 Shell 🐣 (subshell) 中执行,脚本中定义的变量、函数或对环境的修改(如 cd)在脚本结束后不会影响当前的 Shell 环境 🏠。
    • 命令格式:
bash my_script.sh
# 或者,如果脚本兼容 sh
sh my_script.sh
  1. 赋予执行权限后直接运行:
    • 第一步:添加执行权限 🔑: 使用 chmod 命令给脚本文件添加执行权限 (x)
chmod +x my_script.sh

+x 表示为所有用户(所有者、同组用户、其他用户)添加执行权限。你也可以使用更精细的权限设置,如 chmod u+x my_script.sh 只为文件所有者添加执行权限。

  • 第二步:直接执行:如果脚本文件位于当前目录,你需要使用 ./ 来告诉 Shell 在当前目录下查找并执行该文件:
./my_script.sh
  • 如果脚本文件位于系统的 PATH 环境变量 🗺️ 所包含的目录中,或者你指定了完整的绝对/相对路径,则可以直接使用脚本名或路径执行:
# 假设 /opt/scripts 在 PATH 中,且 my_script.sh 在该目录下
my_script.sh
# 或者使用绝对路径
/path/to/your/script/my_script.sh
# 或者使用相对路径
../scripts/my_script.sh
  • 优点: 这是最标准、常用 ✅ 的执行方式,特别是对于需要分发的工具脚本。Shebang 行 #! 决定了使用哪个解释器。
  • 注意: 脚本同样在子 Shell 🐣 (subshell) 中执行,对当前 Shell 环境没有持久影响 🏠。
  • 为什么需要 ./ 出于安全考虑 🛡️。Linux/Unix 系统默认不会在当前目录下查找可执行文件(除非当前目录被显式添加到了 PATH 环境变量中)。使用 ./ 可以明确指定执行当前目录下的文件,防止意外执行了与系统命令同名的恶意脚本 😈。
  1. 使用 source. 命令在当前 Shell 环境 🏠 中执行: 🎯
    • source 是一个 Shell 内建命令,它的简写形式是一个点 (.)。
    • 这种方式不需要给脚本文件设置执行权限 🔑(只需要读权限 r 即可 📖)。
    • 命令格式:
source my_script.sh
# 或者使用点号 (点号和脚本名之间必须有空格!)
. my_script.sh
  • 核心区别: 核心区别: 使用 source. 执行时,脚本中的命令直接在当前的 Shell 环境中 🏠 执行,而不是启动一个新的子 Shell 🐣。
  • 优点/用途: 这意味着脚本中定义的变量、函数、别名 (alias),或者执行的 cdexport 等命令,在脚本执行完毕后会保留在当前的 Shell 会话中 ✅。因此,它常用于:
    • 加载配置文件 ⚙️ (如 .bashrc, .profile, /etc/profile)。
    • 设置环境变量 🌐 供后续命令使用。
    • 定义可以在当前终端后续使用的函数库 📚。
    • 在脚本中切换目录 (cd) 后,希望停留在那个新目录 👉。
  • 注意: 必须确保脚本内容是你希望在当前环境中执行的,因为它可能直接修改 💥 你当前的工作环境。要谨慎使用!⚠️

🎯 执行方式对比小结:

执行方式需要执行权限 (x)? 🔑在子 Shell 中执行? 🐣对当前 Shell 环境的影响 🏠主要用途 🎯
bash script.sh运行一次性任务,不需改变当前环境
./script.sh (需+x)标准的脚本执行 ✅,分发工具脚本
source script.sh (需r) 📖有 (持久)加载配置/环境/函数 ⚙️,改变当前环境

三、注释与可读性

编写清晰易懂 ✨ 的脚本至关重要,而注释是实现这一目标的关键工具 🛠️。

1.单行注释
  • 在 Shell 脚本中,使用 # 符号来表示单行注释 💬。
  • # 开始,直到该行的末尾,所有的内容都会被 Shell 解释器忽略 🙈,不会被执行。
  • 注释可以单独占一行,也可以放在命令的后面。
#!/bin/bash# 这是一个完整的单行注释,用于说明脚本的目的
# Author: Your Name
# Date: 2025-5-2echo "Hello, World!" # 这也是一个注释,解释这行命令的作用# 下面定义一个变量
USER_NAME="Alice" # 为变量赋值
2.多行注释的实现方式

Shell 本身没有提供像 C 语言 /* ... */ 或 Python """ ... """ 那样的原生多行注释块 🧱 语法。但是,可以通过一些技巧 🎩 来实现类似的效果:

  • 方法一:使用 Here Document (推荐用于注释大段代码或文本)
    将你想要注释掉的内容通过 Here Document (<<LIMITER ... LIMITER) 重定向给一个空命令 : (冒号是一个内置的不做任何事情的命令)。LIMITER 可以是任何不出现在注释内容中的字符串,通常使用 EOFCOMMENT。在起始 LIMITER 前加上单引号 (: <<'EOF') 可以阻止其中的变量和命令替换。
#!/bin/bashecho "这行代码会执行": <<'MY_MULTI_LINE_COMMENT'
这里是第一行注释内容。
这里是第二行注释内容。
这整块代码/文字都不会被执行。
可以包含 $VARIABLES 或 `commands`,因为用了 'MY_MULTI_LINE_COMMENT'。
MY_MULTI_LINE_COMMENTecho "这行代码也会执行"
  • 方法二:连续使用单行注释
    这是最简单直接的方法,只需在每一行注释前都加上 #。对于解释性的多行文字,这种方式也很常用。
#!/bin/bash# ==================================
# 这是一个多行注释块
# 用来详细说明某个复杂函数的逻辑
# 或者记录一些重要的注意事项
# ==================================
calculate_sum() {
# 函数内部的注释
local result=$(($1 + $2)) # 计算总和
echo $result
}sum=$(calculate_sum 10 20)
echo "计算结果是: $sum"
3.良好的注释习惯与代码可读性

注释的终极目标 🏆 是提升代码的可读性 👀 和可维护性 🔧。遵循以下原则:

  • 解释“为什么”(Why 🤔),而不是“干什么”(What ✅): 好的代码(比如有意义的变量名和函数名)本身应该能说明它在做什么。注释应该聚焦于解释为什么选择这种实现方式、背后的逻辑、潜在的陷阱 ⚠️ 或重要的上下文
# 不好的注释 (冗余 🤷)
# i = i + 1  # 把 i 加 1# 好的注释 (解释原因 👍)
# 使用特定的算法ID,因为旧版本存在兼容性问题
algorithm_id=3
  • 保持注释简洁同步 🔄: 注释应该清晰明了,避免冗长。最重要的是,当代码发生变化时,务必更新相关的注释,否则过时的注释比没有注释更糟糕!💣
  • 注释复杂 🤯 或不直观的部分: 对于复杂的正则表达式、算法、重要的业务逻辑或临时的 Workaround,添加注释非常有帮助 🙏。
  • 文件头注释 ራስ: 在脚本文件的开头添加注释块,说明脚本的用途、作者、创建/修改日期、版本号、使用方法等信息,是一个非常好的实践 ⭐。
#!/usr/bin/env bash
# ==============================================================================
# Script Name:    backup_database.sh
# Description:    Performs a daily backup of the production PostgreSQL database.
# Author:         Your Name <your.email@example.com>
# Date Created:   2023-5-2
# Last Modified:  2023-5-2
# Version:        1.2
# Usage:          ./backup_database.sh
# Notes:          Requires pg_dump command and write access to BACKUP_DIR.
#                 Recommend running via cron.
# ==============================================================================
  • 利用空行(代码块外的)缩进 🏗️: 合理地使用空行分隔逻辑块。在非代码块的文本部分,可以使用缩进(如列表项)来组织内容,提高结构清晰度。
  • 写给未来的你 🔮 和他人 🤝: 记住,你写的代码和注释,很可能在几个月或几年后需要被你自己或其他同事阅读和维护。清晰的注释是对未来时间和精力的投资 💰。

四、Shell 脚本基础练习题 🧠✍️

题目一:基础概念

❓ 简述 Shell 在 Linux/Unix 系统中的主要作用是什么?它扮演了什么角色

题目二:Shebang

❓ Shell 脚本的第一行 #!/bin/bash 有什么作用?它通常被称为什么

题目三:执行权限

❓ 如何让一个名为 my_script.sh 的 Shell 脚本文件,能够直接通过 ./my_script.sh 的方式运行?请写出关键命令

题目四:执行方式辨析

❓ 执行 Shell 脚本时,使用 bash script.sh 和 source script.sh (或 . script.sh) 的主要区别是什么?哪种方式会影响当前的 Shell 环境? 🤔

题目五:注释

❓ 在 Shell 脚本中,如何添加单行注释?请给出表示注释的符号

题目六:多行注释模拟

❓ Shell 没有原生的多行注释块语法。请描述一种常用的、基于 Here Document 的方法来模拟多行注释。📝

题目七:Shebang 最佳实践

❓ 为什么通常推荐使用 #!/usr/bin/env bash 而不是直接使用 #!/bin/bash 作为 Shebang? 主要优势是什么? 🚀


参考答案 ✅💡

答案一:

Shell 主要作用是作为用户 👤 与 操作系统内核 之间的命令行解释器。它扮演着翻译官 🗣️ 的角色,负责接收、解释用户的命令,调用内核执行,并将结果返回给用户 🖥️。它是实现与系统交互 ↔️ 的桥梁 🌉。

答案二:

#!/bin/bash 的作用是指定解释器。当脚本被直接执行时 (例如通过 ./script.sh),操作系统会根据这一行找到 /bin/bash 解释器来处理脚本中的命令 ✨。这一行通常被称为 Shebang

答案三:

为了让 my_script.sh 可以通过 ./my_script.sh 直接运行,需要给它添加执行权限 🔑。关键命令是:

chmod +x my_script.sh

答案四:

主要区别在于执行环境

  • bash script.sh 会启动一个新的子 Shell (subshell) 🐣 来执行脚本。脚本中的变量定义、函数、cd 等操作不会影响当前的 Shell 环境 🏠。
  • source script.sh (或 . script.sh) 则是在当前的 Shell 环境 🏠 中直接执行脚本的命令。脚本中定义的变量、函数、cd 等操作会保留在当前 Shell 会话中 ✅。

因此,source 或 . 方式会影响当前的 Shell 环境。

答案五:

在 Shell 脚本中,使用 # 符号来添加单行注释 💬。从 # 到行尾的内容都会被解释器忽略 🙈。

答案六:

一种常用的模拟多行注释的方法是使用 Here Document 并将其重定向给一个空命令 :。格式如下:

: <<'任意分隔符'
这里是第一行注释。
这里是第二行注释。
这整块内容都不会被执行。
任意分隔符

使用单引号包裹起始分隔符 (如 ‘任意分隔符’) 可以阻止其中的变量和命令替换,使其更像纯粹的注释块。

答案七:

推荐使用 #!/usr/bin/env bash 的主要优势在于提高了脚本的可移植性 🚀🌍。

  • #!/bin/bash 写死了 bash 解释器的绝对路径。如果用户的 bash 不在这个位置 (例如在 /usr/local/bin/bash),脚本就无法直接执行 💥。
  • #!/usr/bin/env bash 利用 env 命令在用户的PATH 环境变量 🗺️ 中查找 bash 解释器。只要用户的 PATH 中能找到 bash,无论它安装在哪里,脚本都能正确找到并执行 👌。这使得脚本在不同系统、不同环境下的适应性更强 💪。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

青少年编程与数学 02-018 C++数据结构与算法 21课题、机器学习与人工智能算法

青少年编程与数学 02-018 C数据结构与算法 21课题、机器学习与人工智能算法 一、线性回归算法二、逻辑回归算法三、K近邻算法&#xff08;K-Nearest Neighbors, KNN&#xff09;四、决策树算法五、支持向量机&#xff08;SVM&#xff09;六、神经网络算法七、聚类算法八、降维算…

【数据结构】——单链表练习(1)

一、移除链表元素 题目链接&#xff1a; 移除链表元素 那么根据题目的要求我们大致明白这道题要做什么&#xff0c;就是将一个链表中&#xff0c;和指定的值相等的元素的节点删除&#xff0c;然后返回删除后的新的链表&#xff0c;然后题目给我们传入的参数是链表的头节点和指…

AI大模型基础设施:主流的几款开源AI大语言模型的本地部署成本

以下是对目前主流开源AI大语言模型&#xff08;如DeepSeek R1、LLaMA系列、Qwen等&#xff09;本地部署成本的详细分析&#xff0c;涵盖计算机硬件、显卡等成本&#xff0c;价格以美元计算。成本估算基于模型参数规模、硬件需求&#xff08;GPU、CPU、RAM、存储等&#xff09;以…

AI生成视频检测方法及其相关研究

目录标题 【1】AI-Generated Video Detection via Spatio-Temporal Anomaly Learning【2】DeCoF: Generated Video Detection via Frame Consistency【2.1】Spatiotemporal Convolutional Neural Networks (STCNN) rely on spatial artifacts【2.2】Capturing Universal Spatia…

仿腾讯会议——服务器注释

目录 1、修改协议 2、修改登录请求结构体 3、修改登录回复结构体 4、修改注册请求结构体 5、修改发送登录请求函数 6、实现发送注册请求函数 7、修改mysql存储数据格式 8、自己完成部分 1、修改协议 2、修改登录请求结构体 3、修改登录回复结构体 4、修改注册请求结构体…

list的迭代器详讲

1.list的迭代器就是封装了节点指针的类 2.迭代器失效 迭代器失效即迭代器封装的节点指针无效 。因为 list 的底层结构为带头结点的双向循环链表 &#xff0c;因此 在 list 中进行插入时是不会导致 list 的迭代 器失效的&#xff0c;只有在删除时才会失效&#xff0c;并且失效的…

deepSeek论文写作提示词指令大全(覆盖选题、写作、润色到投稿全流程)

一、选题与框架设计 1、跨学科选题突破 指令:"结合[领域A]与[领域B]的前沿理论,生成5个交叉创新性论文选题,要求每个选题包含可行性评估。"(支持跨学科研究创新) 示例:"在人工智能与教育心理学领域生成选题,分析理论适用性与资源获取难度。" 2、…

win11安装WSL(创建用户、更改或重置密码)

文章目录 win11安装WSL设置 Linux 用户名和密码更改或重置密码更新和升级软件包WSL 命令互操作性WSL 的基本命令安装列出可用的 Linux 发行版列出已安装的 Linux 发行版将 WSL 版本设置为 1 或 2设置默认 WSL 版本设置默认 Linux 发行版将目录更改为主页通过 PowerShell 或 CMD…

Vue.js 与 Ajax (vue-resource) 的深入解析

Vue.js 与 Ajax (vue-resource) 的深入解析 引言 在Web开发中,前后端的交互是不可或缺的。Ajax(异步JavaScript和XML)技术允许我们在不重新加载整个页面的情况下,与服务器交换数据和更新部分网页内容。Vue.js 作为一种流行的前端框架,提供了多种方式来处理Ajax请求。其中…

第十三章-PHP MySQL扩展

第十三章-PHP与MySQL 一&#xff0c;连接数据库 1. 使用 MySQLi&#xff08;面向对象方式&#xff09; <?php // 数据库参数 $host localhost; $username root; $password ; $database test_db;// 创建连接 $conn new mysqli($host, $username, $password, $databa…

【文献阅读】全球干旱地区植被突变的普遍性和驱动因素

一、研究背景 全球干旱区&#xff08;drylands&#xff09;覆盖了陆地面积的40%以上&#xff0c;承载了全球约三分之一人口&#xff0c;是生态系统脆弱性较高的区域。这些地区对气候变化和人类干扰尤其敏感。近年来&#xff0c;干旱区发生了大量植被突变现象&#xff0c;即生态…

【Vue3-Bug】中路由加载页面直接显示空白

Vue3中路由加载页面直接显示空白 没有子路由 路由定义不能重复&#xff0c;请自己查看数据在main.js(或者)mina.ts入口文件中&#xff0c;需要将router的注入到vue中的执行放在&#xff0c;vue挂在元素之前 // 顺序不能变 app.use(router) app.mount(#app)在App.vue中 // 在…

影楼精修-露齿笑算法解析

注意&#xff0c;为避免侵权&#xff0c;本文图片均为AIGC生成或网络公开数据&#xff1b; 像素蛋糕-露齿笑 在介绍本文之前&#xff0c;先说一下&#xff0c;其实露齿笑特效&#xff0c;并非像素蛋糕首创&#xff0c;早在几年前&#xff0c;face app就率先推出了这个效果&am…

关于Python:7. Python数据库操作

一、sqlite3&#xff08;轻量级本地数据库&#xff09; sqlite3 是 Python 内置的模块&#xff0c;用于操作 SQLite 数据库。 SQLite 是一个轻量级、零配置的关系型数据库系统&#xff0c;整个数据库保存在一个文件中&#xff0c;适合小型项目和本地存储。 SQLite 不需要安装…

c++互斥锁,竞争状态与临界区

竞争状态与临界区 1&#xff0c;基本互斥锁2&#xff0c;try_lock3&#xff0c;互斥锁存在的坑—线程抢占不到资源4&#xff0c;超时锁5&#xff0c;递归锁&#xff08;在一个线程内可以多次lock的锁&#xff09;recursive_mutex和recursive_timed_mutex用于业务组合6&#xff…

实战项目:基于控制台与数据库的图书管理系统开发指南

一、项目概述与设计思路 1.1 为什么选择图书管理系统 图书管理系统是学习编程的经典项目&#xff0c;它涵盖了&#xff1a; 控制台交互&#xff1a;学习用户输入输出处理 数据库操作&#xff1a;掌握CRUD核心功能 业务逻辑&#xff1a;理解实际应用场景 系统架构&#xff…

人工智能——层次聚类算法

目录 摘要 18 层次聚类 18.1 本章工作任务 18.2 本章技能目标 18.3 本章简介 18.4 编程实战 18.5 本章总结 18.6 本章作业 本章已完结&#xff01;&#xff01;&#xff01; 摘要 本章实现的工作是&#xff1a;首先导入20名学生的3科成绩&#xff0c;然后根据优先聚…

Linux中安装mysql8,转载及注意事项

一、先前往官网下载mysql8 下载地址&#xff1a; https://dev.mysql.com/downloads/选择Linux 二、删除Linux中的mysql&#xff08;如果有的话&#xff09;&#xff0c;上传安装包 1、先查看mysql是否存在&#xff0c;命令如下&#xff1a; rpm -qa|grep -i mysql如果使用这…

《算法导论(第4版)》阅读笔记:p4-p5

《算法导论(第4版)》学习第 3 天&#xff0c;p4-p5 总结&#xff0c;总计 2 页。 一、技术总结 1.instance Thus, given the input sequence h31; 41; 59; 26; 41; 58i, a correct sorting algorithm returns as output the sequence h26; 31; 41; 41; 58; 59i. Such an inp…

第十四篇:系统分析师第三遍——15章

目录 一、目标二、计划三、完成情况四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 五、总结六、后面准备怎么做&#xff1f; 一、目标 通过参加考试&#xff0c;训练学习能力&#xff0c;而非单纯以拿证为目的。 1.在复习过程中&…