脚本开头必须添加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),提升可维护性。