脚本开头必须添加Shebang行(#!
),用于指定解释器路径。Debian环境下推荐以下两种写法:
#!/bin/bash
(适用于大多数Debian系统,Bash是默认Shell之一);#!/usr/bin/env bash
(通过env
命令动态查找bash路径,避免因解释器路径不同导致的兼容性问题)。#!/bin/bash
会导致错误)。find /var/log \ -type f \ -name "*.log" \ -mtime +7
);var=value
),条件判断时变量与运算符需用空格分隔(如if [[ "$var" == "value" ]]; then
)。lowercase_snake_case
)命名(如file_path
、check_file_exists
),避免使用系统关键字(如if
、while
)或函数名作为变量名;UPPERCASE_SNAKE_CASE
)命名(如MAX_RETRIES=5
、export DATABASE_URL="pgsql://..."
),明确区分可变与不可变数据。echo "${my_variable}"
),防止变量值包含空格或特殊字符时导致错误(如$my_variable
未加引号可能被拆分成多个参数);echo "Hello, $name"
),单引号则原样输出(如echo 'Hello, $name'
)。set -euo pipefail
,实现以下功能:
set -e
:任何命令执行失败(退出码非0)时,脚本立即终止;set -u
:使用未定义变量时,脚本立即终止;set -o pipefail
:管道命令中任一命令失败,整个管道返回失败状态。echo "Error: File not found." >&2
),区分正常输出与错误输出;$?
),如mkdir /data || { echo "Failed to create directory."; exit 1; }
;trap
命令在脚本退出时(包括错误退出)执行清理操作(如删除临时文件),例如trap 'rm -f "$temp_file"' EXIT
。# 需要重试3次以提高成功率
),而非“是什么”(如# i加1
);# ---
或# ===
等分割线分隔不同功能的代码块(如# --- 初始化变量 ---
),提高可读性;i=$((i + 1))
无需注释“i加1”,但复杂逻辑(如正则表达式)需注释说明用途。chmod 755 script.sh
),确保只有所有者可写(防止未授权修改);敏感脚本(如包含密码)需限制为chmod 700
;[[ $input =~ ^[0-9]+$ ]]
验证数字);printf "%s" "$input" | sed 's/[^a-zA-Z0-9._-]/_/g'
去除特殊字符);ls "$dir"
而非ls $dir
),避免命令注入。/usr/bin/apt
应改为command -v apt
(动态查找命令路径),适配不同Debian版本或自定义安装路径;apt
、dpkg
、tar
),避免依赖第三方工具(除非必要);set -x
开启调试(显示执行的命令及参数),帮助定位问题(如bash -x script.sh
);echo "$(date): Script started." >> script.log
),便于后续排查问题;test_check_file_exists
),降低调试复杂度。function backup_files { ... }
),提高代码复用性;$1
、$2
等位置参数传递输入(如./script.sh input_dir output_dir
),增强脚本灵活性;source
命令引入公共函数(如source utils.sh
),提升可维护性。