0Pricing
Linux Command Line & Bash Scripting Mastery · 课时

脚本编写最佳实践与代码检查

学习编码规范、注释以及 ShellCheck 等工具,编写整洁、易读且无错误的 Bash 脚本。

脚本编写最佳实践与代码检查 是 CoddyKit 上的免费 Linux Command Line & Bash Scripting Mastery 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Linux Command Line & Bash Scripting Mastery 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Linux Command Line & Bash Scripting Mastery 课程共包含 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 导师)并解锁 Linux Command Line & Bash Scripting Mastery 课程的其余内容,请升级到 CoddyKit PRO。 Linux Command Line & Bash Scripting Mastery 课程共包含 4 节课。

「脚本编写最佳实践与代码检查」这节课中我会学到什么?

学习编码规范、注释以及 ShellCheck 等工具,编写整洁、易读且无错误的 Bash 脚本。 你通过在浏览器中直接运行的动手代码来练习 Linux Command Line & Bash Scripting Mastery,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Linux Command Line & Bash Scripting Mastery 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Linux Command Line & Bash Scripting Mastery 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「脚本编写最佳实践与代码检查」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Linux Command Line & Bash Scripting Mastery 课中编写并运行代码吗?

能。每节 Linux Command Line & Bash Scripting Mastery 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 调试 Bash 脚本(set -x、trap)
  2. 错误处理与退出状态
  3. 脚本编写最佳实践与代码检查
  4. 使用 Bats 测试 Bash 脚本
← 返回 Linux Command Line & Bash Scripting Mastery