脚本编写最佳实践与代码检查
学习编码规范、注释以及 ShellCheck 等工具,编写整洁、易读且无错误的 Bash 脚本。
脚本编写最佳实践与代码检查 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 4 节课。
为什么要遵循脚本编写最佳实践?
编写 Bash 脚本功能强大,但如果没有良好的习惯,脚本可能会变得难以理解、维护和调试。
最佳实践是帮助您编写整洁、健壮且易读代码的指导原则。它们可以让您的脚本:
- 更易阅读:方便您自己和他人阅读。
- 更易维护:更容易更新或修复。
- 更少出错:减少常见错误。
- 更适合协作:统一代码的外观和行为。
通过注释提高可读性
注释对于解释代码为什么这样做至关重要,而不仅仅是说明代码做了什么。它们可以作为给未来的您或其他开发者留下的说明。
您可以使用注释来:
- 在顶部说明脚本的总体用途。
- 解释复杂的逻辑或难以理解的部分。
- 记录函数:说明其用途、参数和返回值。
使用 #(井号)符号开始注释。
#!/bin/bash
# This script demonstrates commenting best practices.
# Author: CoddyKit
# Date: 2023-10-27
# Function: greet_user
# Description: Prints a greeting message to the console.
# Arguments:
# $1 - The name of the user to greet.
greet_user() {
local name="$1" # Store the first argument in a local variable.
echo "Hello, ${name}!" # Output the greeting message.
}
# Main script execution starts here.
echo "Script execution started."
greet_user "CoddyKit Learner" # Call the function with a specific name.
echo "Script execution finished."清晰的命名约定
有意义的名称可以让脚本更易于理解。除非是常见的循环计数器(例如 i 或 j),否则请避免使用单字母变量。
常见约定:
- 变量:使用描述性名称(例如
user_name、log_file)。环境变量或全局常量使用UPPERCASE。脚本中的局部变量使用lowercase_with_underscores。 - 函数:使用
lowercase_with_underscores,通常以动词开头(例如process_data、check_status)。 - 脚本:使用
lowercase_with_hyphens(例如backup-script.sh)。
保持格式和缩进一致
统一的格式(例如缩进和空格)可以显著提高可读性。想象一下阅读一本段落缩进不一致的书!
要点:
- 使用 2 个或 4 个空格进行缩进(通常不建议使用制表符)。
- 保持行简短(对于终端而言,不超过 80 个字符是一个不错的经验法则)。
- 使用空行分隔代码的逻辑块。
- 在适当的情况下对齐相关元素。
一致性比您选择的具体风格更重要。
健壮性:'set -u'(nounset)
set -u(或 set -o nounset)选项可以有效防止由拼写错误或意外未设置的变量引起的错误。如果脚本尝试使用尚未赋值的变量,set -u 会立即让脚本因错误退出。
这有助于及早发现错误,避免脚本后续出现意外行为。
请尝试运行下面的代码。由于未定义 UNSET_NAME,代码会提前退出。
#!/bin/bash
# Demonstrating 'set -u' (nounset)
set -u # Exit if an unset variable is used
MY_GREETING="Hello"
echo "${MY_GREETING}, CoddyKit!"
# This variable is NOT set. With 'set -u', the script will exit here.
echo "Your name is: ${UNSET_NAME}"
echo "This line will NOT be reached if 'set -u' is active and UNSET_NAME is indeed unset."健壮性:'set -o pipefail'
当您通过管道连接命令时(例如 cmd1 | cmd2 | cmd3),Bash 通常只报告管道中最后一条命令的退出状态。这意味着即使 cmd1 失败,而 cmd2 和 cmd3 成功,管道仍可能报告成功!
set -o pipefail 会改变这一行为。如果管道中的任意命令失败(返回非零退出状态),整个管道的退出状态就会是该非零状态。
这样可以让您的管道更加可靠,在前面的命令失败时立即发出信号。
#!/bin/bash
# Demonstrating 'set -o pipefail'
set -o pipefail # Ensures pipe's exit status is the last non-zero command
echo "Running a failing command in a pipe:"
echo "---"
# 'false' command always fails (exit status 1).
# 'cat /dev/null' always succeeds (exit status 0).
# With 'set -o pipefail', the pipe's overall exit status will be 1 from 'false'.
false | cat /dev/null
# This line will only be reached if the pipe above succeeds.
echo "---"
echo "Script finished successfully (this line won't show if pipe failed with set -o pipefail)."介绍 ShellCheck
即使遵循最佳实践,也很容易忽略细小的语法错误或常见陷阱。这正是 ShellCheck 发挥作用的地方!
ShellCheck 是一种用于 shell 脚本的静态分析工具(即“代码检查工具”)。它会读取您的脚本,并指出:
- 语法错误。
- 初学者常犯的错误。
- 隐蔽的语义问题。
- 不同 shell 之间的可移植性问题。
它还会提供有帮助的建议,通常附带指向更详细解释的链接。
ShellCheck 实战:错误脚本
让我们看看一个包含一些常见问题的脚本。这些问题可能不会立即导致脚本崩溃,但属于不良实践或潜在错误。
假设您已将此脚本保存为 bad_script.sh。要对它运行 ShellCheck,您可以输入:shellcheck bad_script.sh
运行 ShellCheck 之前,看看您能否找出其中的问题!
#!/bin/bash
# A script with some common issues
MY_NAME=coddykit # Variable assignment needs no space, but quoting is good for values
echo "Hello $MY_NAME!" # Missing quotes around variable expansion
if [ $1 = "admin" ]; then # Missing quotes around $1
echo "Welcome, administrator."
fi
# A simple loop with potential issues
for file in *.txt; do # Unquoted glob could expand to multiple arguments
echo File: $file # Missing quotes around $file
done修复 ShellCheck 警告
ShellCheck 会提供类似这样的输出:SC2086: Double quotes missing around "$MY_NAME"。它通常会给出具体的代码(例如 SC2086),您可以查阅该代码以了解更多详情。
下面是之前的脚本,我们已根据 ShellCheck 的建议和通用最佳实践进行了修复:
请注意,在变量展开和命令替换周围使用了双引号 "",以防止单词拆分和通配符展开,因为它们是常见的错误来源。
#!/bin/bash
# A script with issues fixed by ShellCheck
MY_NAME="CoddyKit" # Quote variable assignment values
echo "Hello ${MY_NAME}!" # Always quote variable expansions
if [ "$1" = "admin" ]; then # Quote positional parameters like $1
echo "Welcome, administrator."
fi
# A simple loop with corrected quoting
for file in *.txt; do
echo "File: ${file}" # Quote variable expansions, especially in loops
done最佳实践检查
编写 Bash 脚本时,以下哪些做法被认为是良好实践?
回顾:专业脚本编写
恭喜您!您已经学会了如何将 Bash 脚本从能运行提升到专业水平。
我们学习了:
- 采用最佳实践,提高可读性和可维护性的重要性。
- 使用注释和命名约定来增强清晰度。
- 通过
set -u和set -o pipefail让脚本更加健壮。 - 利用 ShellCheck 自动查找问题并改进代码。
应用这些原则后,您将能够编写出更可靠、更易理解、也更便于协作的 Bash 脚本。请继续练习!
常见问题解答
「脚本编写最佳实践与代码检查」课时是免费的吗?
是的 — 「脚本编写最佳实践与代码检查」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。
「脚本编写最佳实践与代码检查」这节课中我会学到什么?
学习编码规范、注释以及 ShellCheck 等工具,编写整洁、易读且无错误的 Bash 脚本。 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 DevOps Bootcamp 需要有经验吗?
无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「脚本编写最佳实践与代码检查」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 DevOps Bootcamp 课中编写并运行代码吗?
能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 调试 Bash 脚本(set -x、trap)
- 错误处理与退出状态
- 脚本编写最佳实践与代码检查
- 使用 Bats 测试 Bash 脚本