Skip to content

注释

单行注释

基本语法

bash
#!/bin/bash

# 这是一个单行注释
echo "Hello, World!"

# 在命令后添加注释
echo "Hello, World!"  # 这也是注释

# 注释可以解释代码
name="张三"  # 定义变量 name
echo "$name"  # 输出变量

注释的作用

bash
#!/bin/bash

# 脚本名称: hello.sh
# 功能描述: 打印欢迎信息
# 作者: Your Name
# 创建日期: 2024-01-01
# 版本: 1.0

echo "Hello, World!"

多行注释

使用 : << 'EOF'

bash
#!/bin/bash

: << 'EOF'
这是一个多行注释
可以写多行内容
不会被执行
EOF

echo "Hello, World!"

使用 : << 'COMMENT'

bash
#!/bin/bash

: << 'COMMENT'
这是多行注释
可以包含任意字符
包括特殊符号
COMMENT

echo "Hello, World!"

使用 : << 'BLOCK'

bash
#!/bin/bash

: << 'BLOCK'
这是多行注释的另一种写法
使用不同的标识符
BLOCK

echo "Hello, World!"

注释的最佳实践

1. 解释代码功能

bash
# 好的做法
# 计算两个数的和
result=$((a + b))

# 不好的做法
result=$((a + b))

2. 添加脚本说明

bash
#!/bin/bash

# 脚本名称: backup.sh
# 功能描述: 备份指定目录到指定位置
# 使用方法: ./backup.sh <源目录> <目标目录>
# 作者: Your Name
# 创建日期: 2024-01-01
# 版本: 1.0

# 检查参数
if [ $# -ne 2 ]; then
    echo "使用方法: $0 <源目录> <目标目录>"
    exit 1
fi

# 备份操作
cp -r "$1" "$2"

3. 标记待办事项

bash
#!/bin/bash

# TODO: 添加错误处理
# TODO: 优化性能
# FIXME: 修复这个 bug
# HACK: 临时解决方案

echo "Hello, World!"

4. 解释复杂逻辑

bash
#!/bin/bash

# 检查文件是否存在,如果不存在则创建
if [ ! -f "$file" ]; then
    touch "$file"
fi

# 检查文件是否可读,如果不可读则修改权限
if [ ! -r "$file" ]; then
    chmod +r "$file"
fi

注释的使用场景

1. 文件头注释

bash
#!/bin/bash

# ==============================================
# 脚本名称: system_monitor.sh
# 功能描述: 系统监控脚本
# 作者: Your Name
# 创建日期: 2024-01-01
# 版本: 1.0
# ==============================================

# 检查系统状态
check_system_status() {
    # 检查 CPU 使用率
    cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
    echo "CPU 使用率: $cpu_usage"

    # 检查内存使用率
    mem_usage=$(free -m | grep "Mem" | awk '{print $3/$2 * 100.0}')
    echo "内存使用率: $mem_usage"

    # 检查磁盘使用率
    disk_usage=$(df -h / | awk 'NR==2 {print $5}')
    echo "磁盘使用率: $disk_usage"
}

2. 函数注释

bash
#!/bin/bash

# 计算两个数的和
# 参数: $1 - 第一个数, $2 - 第二个数
# 返回: 两个数的和
add() {
    echo $(($1 + $2))
}

# 计算两个数的积
# 参数: $1 - 第一个数, $2 - 第二个数
# 返回: 两个数的积
multiply() {
    echo $(($1 * $2))
}

# 使用函数
result=$(add 10 20)
echo "10 + 20 = $result"

result=$(multiply 10 20)
echo "10 * 20 = $result"

3. 配置说明

bash
#!/bin/bash

# ==============================================
# 配置文件
# ==============================================

# 日志目录
LOG_DIR="/var/log/myapp"

# 日志文件
LOG_FILE="$LOG_DIR/app.log"

# 最大日志大小(MB)
MAX_LOG_SIZE=100

# 日志保留天数
LOG_RETENTION_DAYS=30

# ==============================================
# 函数定义
# ==============================================

# 记录日志
log() {
    local message="$1"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] $message" >> "$LOG_FILE"
}

# 检查日志大小
check_log_size() {
    local size=$(du -m "$LOG_FILE" | cut -f1)
    if [ $size -gt $MAX_LOG_SIZE ]; then
        log "日志文件超过最大大小,进行轮转"
        rotate_log
    fi
}

# 日志轮转
rotate_log() {
    local timestamp=$(date '+%Y%m%d_%H%M%S')
    mv "$LOG_FILE" "$LOG_FILE.$timestamp"
    touch "$LOG_FILE"
    log "日志轮转完成"
}

4. 调试注释

bash
#!/bin/bash

# 调试模式
DEBUG=false

# 调试输出函数
debug() {
    if [ "$DEBUG" = true ]; then
        echo "[DEBUG] $1"
    fi
}

# 主程序
main() {
    debug "开始执行程序"

    # 执行一些操作
    debug "执行操作 1"
    # 操作 1 的代码

    debug "执行操作 2"
    # 操作 2 的代码

    debug "程序执行完成"
}

# 运行主程序
main

临时禁用代码

使用注释禁用代码

bash
#!/bin/bash

# 启用的代码
echo "Hello, World!"

# 临时禁用的代码
# echo "这行代码被禁用了"
# echo "这行代码也被禁用了"

# 再次启用的代码
echo "Goodbye, World!"

使用多行注释禁用代码块

bash
#!/bin/bash

echo "Hello, World!"

: << 'DISABLED_CODE'
echo "这段代码被禁用了"
echo "可以包含多行"
echo "不会被执行"
DISABLED_CODE

echo "Goodbye, World!"

注释的注意事项

1. 不要过度注释

bash
# 好的做法
# 计算两个数的和
result=$((a + b))

# 不好的做法
# 定义变量 result
# 使用算术运算符 +
# 计算 a 和 b 的和
# 将结果赋值给 result
result=$((a + b))

2. 保持注释的准确性

bash
# 好的做法
# 计算两个数的积
result=$((a * b))

# 不好的做法
# 计算两个数的和
result=$((a * b))  # 注释与代码不符

3. 注释应该解释为什么,而不是是什么

bash
# 好的做法
# 使用临时文件避免内存溢出
temp_file=$(mktemp)

# 不好的做法
# 创建临时文件
temp_file=$(mktemp)

实用示例

示例1:完整的脚本注释

bash
#!/bin/bash

# ==============================================
# 脚本名称: backup.sh
# 功能描述: 备份指定目录到指定位置
# 使用方法: ./backup.sh <源目录> <目标目录>
# 作者: Your Name
# 创建日期: 2024-01-01
# 版本: 1.0
# ==============================================

# 配置变量
BACKUP_DATE=$(date '+%Y%m%d_%H%M%S')
LOG_FILE="/var/log/backup.log"

# 记录日志函数
log() {
    local message="$1"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] $message" >> "$LOG_FILE"
}

# 检查参数
if [ $# -ne 2 ]; then
    echo "错误: 参数数量不正确"
    echo "使用方法: $0 <源目录> <目标目录>"
    exit 1
fi

# 检查源目录是否存在
if [ ! -d "$1" ]; then
    echo "错误: 源目录不存在: $1"
    log "错误: 源目录不存在: $1"
    exit 1
fi

# 创建目标目录
mkdir -p "$2"

# 执行备份
log "开始备份: $1 -> $2"
cp -r "$1" "$2/backup_$BACKUP_DATE"

# 检查备份是否成功
if [ $? -eq 0 ]; then
    log "备份成功"
    echo "备份成功: $2/backup_$BACKUP_DATE"
else
    log "备份失败"
    echo "备份失败"
    exit 1
fi

示例2:函数注释

bash
#!/bin/bash

# 检查服务状态
# 参数: $1 - 服务名称
# 返回: 0 - 运行中, 1 - 未运行
check_service_status() {
    local service="$1"
    if systemctl is-active --quiet "$service"; then
        return 0
    else
        return 1
    fi
}

# 重启服务
# 参数: $1 - 服务名称
# 返回: 0 - 成功, 1 - 失败
restart_service() {
    local service="$1"
    systemctl restart "$service"
    return $?
}

# 使用函数
if check_service_status "nginx"; then
    echo "nginx 正在运行"
else
    echo "nginx 未运行,尝试重启"
    if restart_service "nginx"; then
        echo "nginx 重启成功"
    else
        echo "nginx 重启失败"
    fi
fi

总结

注释的关键点:

  1. 单行注释:使用 # 符号
  2. 多行注释:使用 : << 'EOF' 语法
  3. 注释作用:解释代码、提供说明、标记待办事项
  4. 最佳实践
    • 解释代码功能
    • 添加脚本说明
    • 标记待办事项
    • 解释复杂逻辑
  5. 注意事项
    • 不要过度注释
    • 保持注释的准确性
    • 注释应该解释为什么,而不是是什么

下一节我们将学习条件判断的使用。