news 2026/9/17 4:45:30

Bash 注释完全指南:`` 语法、Shebang 区别与脚本文档化实践(Introduction to Bash Scripting)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Bash 注释完全指南:`` 语法、Shebang 区别与脚本文档化实践(Introduction to Bash Scripting)

Bash 注释完全指南:#语法、Shebang 区别与脚本文档化实践(Introduction to Bash Scripting)

【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting

本文基于开源电子书Introduction to Bash Scripting的葡语版第 006 章「Comentários em Bash」(Bash 注释)展开,讲解 Bash 注释的#语法与使用规则,并借助本仓库中的真实工程脚本(如 shellcheck 校验脚本)与 epub 构建配置,展示注释在生产级 Bash 脚本中的真实形态。读完本文,你将掌握:如何为脚本添加规范注释、#作为注释与 Shebang 的边界区别,以及如何在工程脚本中用注释块文档化用法、参数与退出码。

核心概念:Bash 注释的#语法

与其他编程语言一样,你可以向脚本中添加注释。注释用于在代码中给自己或其他维护者留下说明性笔记。原文档给出的规则非常简洁(见 ebook/pt_br/content/006-bash-comments.md):

  • 行首添加#符号即可将该行标记为注释;
  • 注释行永远不会被渲染到屏幕上,即解释器不会执行它,终端也不会打印它;
  • 注释与echo输出的文本完全无关,它只是写给人看的。

原文档给出的最小示例:

# Este é um comentário e não será renderizado na tela # (这是一个注释,不会被渲染到屏幕上)

在交互终端中验证也很直观——输入以#开头的行后按回车,Bash 会直接忽略它,没有任何输出。这与echo "# 这不是注释"形成鲜明对比:#只有出现在命令位置的行首(或紧跟在一条完整命令之后的位置)时才具有注释语义,放在双引号/单引号字符串内部的#只是普通字符。

实战:为脚本添加注释

原文档将注释应用到此前章节逐步构建的“问候脚本”上。这个脚本源自 005 章“用户输入” 中用read -p提示用户输入名称的练习,完整继承如下:

#!/bin/bash # Pergunte ao usuário seu nome # (询问用户姓名) leia -p "Qual é o seu nome?" name # (提示“你叫什么名字?”并读入 name 变量) # Cumprimentar o usuário # (问候用户) echo "Hello $name" echo "Bem-vindo ao DevDojo!"

注意:葡语版文档中出现了leia(葡萄牙语“读”的意思,是机器翻译遗留),英文原版 006 章 中对应的是read -p "What is your name? " name。实际编写脚本时应使用内置命令read -p

注释的插入位置体现了两条实用原则:

  1. 在功能段之前注释该段的意图(“询问用户姓名”“问候用户”),而不是逐行翻译代码字面含义;
  2. 注释与代码之间可留空行,保持视觉分区清晰。

运行方式沿用本书前几章的既有流程(见 002 章“Bash 结构” 与 003 章“Hello World”):

touch devdojo.sh # 创建脚本文件 nano devdojo.sh # 编辑,粘贴上方脚本 chmod +x devdojo.sh # 赋予可执行权限 ./devdojo.sh # 运行,也可用 bash devdojo.sh

运行后终端只会显示提示语和两行echo输出,三行注释本身不会出现在输出中——这正是原文档所强调的“注释永远不会渲染”。

#的边界:Shebang、行内注释与字符串

Shebang 与注释的区别

脚本第一行的#!/bin/bash#!开头,但它不是注释。根据 002 章 的说明,Shebang 指示操作系统用/bin/bash这个可执行文件来执行该脚本。两者形近但作用完全不同:

行首形式语义生效条件
#!/bin/bashShebang,指定解释器仅当位于脚本第一行且直接以#!连写时才有效
# 文本注释,被解释器忽略任意位置(行首)

如果把#/bin/bash之间加空格写成# /bin/bash,它就退化成了普通注释,Shebang 失效——这是新手常见的坑。

行内注释

#不仅可以独占一行,也可以放在一条完整命令的后面作为行尾注释:

read -p "What is your name? " name # 读取用户输入到 name echo "Hi there $name" # 向用户问好

解释器会把行尾从#起的内容丢弃。需要注意的是#前必须有一个空白字符且位于词边界之外:name# comment会被解释为变量/单词的一部分而不是注释。

字符串中的#

echo "Hello #1 fan" # 输出:Hello #1 fan

引号内的#原样保留,这在实际脚本中很常用(例如日志前缀#2026-09-16)。编写含#的提示语时(如read -p "# 请输入名称: "),只要#在引号内,就不会触发注释语义。

仓库级佐证:工程脚本中注释的真实形态

原文档的结论是:“注释是描述脚本中较复杂功能的绝佳方式,能让其他人轻松找到并读懂你的代码。” 本仓库自身就是这句话的最佳例证。查看 scripts/shellcheck-ebook.sh 的开头,它用一个大注释块完整文档化了脚本的接口:

#!/bin/bash # # Extract bash code blocks from the English ebook # markdown files and run shellcheck on each one. # # Usage: # ./scripts/shellcheck-ebook.sh [ebook_dir] # # Arguments: # ebook_dir Path to the ebook content directory (default: ebook/en/content) # # Exit codes: # 0 All code blocks pass shellcheck # 1 One or more code blocks have shellcheck warnings #

这是 Bash 工程中非常成熟的“头部注释块”模式:功能概述 + Usage + Arguments + Exit codes,让维护者不读实现代码就能正确使用脚本。

进一步看该脚本对 ShellCheck 排除码的注释(scripts/shellcheck-ebook.sh):

# Shellcheck codes to exclude for code snippets: # SC2034 - variable appears unused (snippets define vars used in later snippets) # SC2154 - variable referenced but not assigned (same reason) # SC2145 - argument mixes string and array (educational $@ examples) # SC2078 - constant expression (placeholder names like test_case_1) # SC2043 - loop will only run once (deliberate bad-example demonstrations) # SC2211 - glob used as command (crontab syntax lines) EXCLUDE="SC2034,SC2154,SC2145,SC2078,SC2043,SC2211"

这段注释解释了每个魔法值存在的原因(例如SC2043是故意用于展示错误示例的循环),这正是原文档所说“描述较复杂功能”的典型场景——没有这些注释,读者很难理解为什么恰好排除这 6 个代码。

同样的注释实践也出现在非代码文件中。ebook/pt_br/epub.yml 的前两行用注释记录了 ePub 的生成命令:

# Generate an ePub by running: # pandoc content/*.md epub.yml -o export/introduction-to-bash-scripting.epub

它把“如何重新构建产物”这一隐性知识固化在配置旁边,任何译者接手pt_br目录时都能立即知道如何重新导出 export 目录 中的 PDF/ePub。可以推断,对于多语言电子书仓库,这类注释显著降低了本地化维护成本。

注释与调试的协同

注释的价值在调试阶段会进一步放大。结合本书 013 章“调试、测试与快捷键” 的内容:用bash -x ./your_script.sh或在脚本中加入set -x时,终端会逐行打印实际执行的命令。此时,行尾注释会随执行行一起打印出来(trace 输出中保留#注释部分),相当于免费的“执行轨迹说明”。例如:

# 调试模式下 bash -x 的输出类似: + read -p 'What is your name? ' name + echo 'Hi there Bobby'

若脚本中每段逻辑都有意图性注释,-x输出的可读性会大幅提升。这也是原文档“让其他人轻松读懂你的代码”这一主张在调试维度的延伸。

快速参考与写作建议

写法是否有效注释说明
# 这是注释行首注释,整行被忽略
echo hi # 行尾注释行内注释,#前需有空白
#!/bin/bashShebang,仅第一行有效
# /bin/bash是(但 Shebang 失效)空格破坏了#!语义
echo "#1 结果"引号内的#是普通字符

结合原文档结论与本仓库的工程实践,总结几条注释写作建议:

  1. 写“为什么”,少写“是什么”——像shellcheck-ebook.sh那样解释每个排除码的原因,而不是复述代码字面含义;
  2. 在脚本头部保留 Usage/Arguments/Exit codes 注释块,这是 Bash 生态(没有内建--help生成机制)中最重要的自文档化手段;
  3. 在配置文件中注明生成/构建命令,如epub.yml顶部对 pandoc 命令的注释;
  4. 注释语言建议用英文——本仓库pt_br版章节中的注释是随正文翻译的(如leia残留所示),而在多语言协作仓库中,英文注释可被所有语言的维护者检索。

小结

Bash 注释的规则极简:行首#即注释,永不被执行或输出。但工程实践中注释的作用远超“留个笔记”:它是脚本的自文档(头部注释块)、是魔法值的解释器(如 ShellCheck 排除码列表)、是调试 trace 的旁白、也是配置文件的构建说明。以 006 章 的三行示例脚本为起点,参照 scripts/shellcheck-ebook.sh 的注释风格,你就拥有了在本书后续章节(参数、数组、函数、实战脚本)中编写可维护 Bash 脚本的注释基础。

【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 4:45:07

agent-plugins 插件三要素:Skills、MCP、Rules 如何协同工作

agent-plugins 插件三要素:Skills、MCP、Rules 如何协同工作 【免费下载链接】agent-plugins 项目地址: https://gitcode.com/GitHub_Trending/skills16/agent-plugins 🎯 agent-plugins 是什么?三要素如何分工 agent-plugins 是 Fl…

作者头像 李华
网站建设 2026/9/17 4:43:57

Rust + 大语言模型:构建可靠的运维配置生成器

年后我们团队做了一次比较大的重构,把原来维护了两年的 Python 配置生成脚本全部换掉,改用 Rust 和大语言模型重新搭了一套运维配置生成器。我先把话说在前面:这个技术组合听起来很“高大上”,但实际落地的时候,难点根…

作者头像 李华
网站建设 2026/9/17 4:40:49

DeepSeek Harness桌面端实测:从API调试到VSCode/Codex接入全指南

从昨天在开发者群看到 DeepSeek 官方仓库里多了一个 DeepSeek Harness 桌面端的消息,我第一时间就去翻仓库、跑代码、配环境,折腾到凌晨。这东西不是又一个套壳聊天客户端,而是官方在模型 API 之外补上的一层工程化工具链。对于正在做 LLM 应…

作者头像 李华
网站建设 2026/9/17 4:39:08

腾讯云FDE工程师认证:云交付新时代的入场券

行业内卷到这个程度,连工程师认证都开始细分赛道了。最近圈子里讨论最多的,就是腾讯云推出的行业首个FDE工程师认证,外加同步启动的FDE合作伙伴招募计划。乍一看这像是一条普通的企业新闻稿,但结合我自己这几年做云架构、跑项目交…

作者头像 李华
网站建设 2026/9/17 4:37:41

Cemu 模拟器配置指南:新手从编译到调参跑通 Wii U 模拟

Cemu 模拟器配置指南:新手从编译到调参跑通 Wii U 模拟 【免费下载链接】Cemu Cemu - Wii U emulator 项目地址: https://gitcode.com/GitHub_Trending/ce/Cemu Cemu 是一款 Wii U 模拟器,把主机上的游戏跑在你的电脑上。多数人第一次配置就卡在依…

作者头像 李华
网站建设 2026/9/17 4:37:33

DeepTutor 上手指南:从本地部署到个人 AI 知识库的完整路径

DeepTutor 上手指南:从本地部署到个人 AI 知识库的完整路径 【免费下载链接】DeepTutor DeepTutor: Lifelong Personalized Tutoring. https://deeptutor.info/. 项目地址: https://gitcode.com/GitHub_Trending/dee/DeepTutor DeepTutor 是一个开源的智能学…

作者头像 李华