Shell Scripting & Bash 最佳实践:本技能提供编写健壮、可移植、可维护 Shell 脚本的综合指南,覆盖 Bash 惯用法、POSIX 兼容性、错误处理、安全以及真实场景模式。
用途:当用户要求“编写 bash 脚本”“创建 shell 脚本”“解析命令行参数”“编写部署脚本”等任务时使用,可作为编写 Bash/Shell 脚本时的规范与模板参考。
主要能力与内容概览:
-
Bash 脚本模板 每个脚本应以坚实的基础开头。资料提供的模板包含:#!/usr/bin/env bash 开头、脚本用途与用法说明注释、作者与日期注释;set -euo pipefail 与 IFS=$'\n\t';readonly 常量(SCRIPT_NAME、SCRIPT_DIR、VERSION);cleanup trap(清理临时文件并在退出时保留退出码),以及 INT/TERM 信号 trap;main 函数负责调用 parse_args、validate_dependencies 并承载业务逻辑。资料解释了各选项含义:set -e 命令失败立即退出;set -u 未设置变量视为错误;set -o pipefail 管道中任一命令失败则整个管道失败;IFS=$'\n\t' 使分词更安全,避免文件名含空格的问题。
-
变量处理 引用规则:除非明确需要分词或通配,否则始终给变量加双引号。资料给出正确与错误对照。变量展开与默认值:${DB_HOST:-localhost} 默认值;: "${LOG_LEVEL:=info}" 赋值默认;: "${API_KEY:?ERROR: API_KEY must be set}" 未设置则报错;子串提取 ${filename:0:6}、${filename: -3};长度 ${#filename};变量间接引用 ${!var_name}。删除与替换:${filepath#/}、${filepath##/}(basename)、${filepath%.}、${filepath%%.}、${filepath/user/admin}、${msg//-/_};大小写转换 ${text,,}、${text^^}、${text~}(Bash 4+)。
-
条件与测试 包含 if/elif/else 示例(按文件存在性选择配置源)。文件测试:-e、-f、-d、-L、-r、-w、-x、-s、-nt、-ot。字符串测试:-z、-n、==、!=、通配匹配、=~ 正则匹配。数值比较:-eq、-ne、-lt、-gt、-le、-ge。[[ ]] 内的逻辑运算符 &&、||、!。算术:(( count++ ))、(( total = price * quantity ))、if (( age >= 18 ))、三元风格 (( result = (a > b) ? a : b ))。
-
循环 for 循环:遍历列表、C 风格、安全遍历文件(用 [[ -f "$file" ]] || continue 防止无匹配)、逐行读取命令输出、遍历数组。while/until:计数器循环、逐行读取文件、以自定义分隔符读取(如 /etc/passwd 的冒号分隔)、until ping 等待主机上线。循环控制:continue、break。
-
函数与返回值 函数定义与 local 变量、通过 stdout 返回计算结果、return 0/1 表示成功失败、Bash 4.3+ 的 nameref(local -n ref)输出结果。
-
命令行参数解析 手动解析(灵活、支持长选项):usage 函数用 heredoc 输出帮助;默认值;while [[ $# -gt 0 ]] + case 处理 -o/--output、-v/--verbose、-n/--dry-run、-h/--help、--version、--、未知选项报错、位置参数。getopts(POSIX 兼容,仅短选项):":vo:h" 与 OPTARG、shift $((OPTIND - 1))。
-
输入输出重定向与管道
、>>、2>、&>、> out.log 2>&1、2>/dev/null;分别重定向 stdout 与 stderr;here document(含使用引号 'EOF' 禁止变量展开的写法);here string <<<;进程替换 <(sort file1.txt);管道的 pipefail 与错误检查;tee 及 tee -a、2>&1 | tee;文件描述符操作(exec 3>、>&3、exec 3>&-)。
-
进程管理 后台运行与 $!、wait 指定 PID 或全部作业、受控并发(max_jobs 与 jobs -r 检查)、信号 trap 优雅关闭并 kill -- -$$、PID 文件实现单例(acquire_lock/release_lock、kill -0 检查、陈旧 PID 文件清理)、timeout 超时命令。
-
字符串操作(参数展开) 无需 sed/awk 的简单字符串处理:修剪首尾空白、包含子串判断、按分隔符拆分为数组、数组连接为字符串、重复字符 printf '=%.0s' {1..60}、首字符大小写。
-
数组处理 索引数组声明、追加、索引访问、全部元素、长度、全部索引、切片、unset 删除元素、遍历;关联数组(Bash 4+)声明、赋值、-v 检查键、遍历键值;mapfile -t 从命令输出构建数组;数组过滤。
-
错误处理模式 ERR trap 自定义错误处理器(输出行号、命令、退出码);die 函数;retry 指数退避重试;require_cmd 检查命令存在;assert 断言。
-
文件操作 mktemp 临时文件/目录与 EXIT trap 清理;find 按名称、时间、大小筛选及 -exec;可移植逐行读取(含 || [[ -n "$line" ]] 处理无结尾换行);原子写入(写临时文件再 mv);ensure_dir 检查并创建目录;cmp -s 比较文件。
适用场景:编写或改进 Bash/Shell 脚本、自动化与部署脚本、命令行工具、日志处理、进程与任务编排、需要 POSIX 兼容或需要健壮错误处理的脚本开发。
限制:资料未提供该技能的具体安装方式、平台支持范围、收费或价格信息、以及除上述内容外的其他功能说明,这些内容暂未提供。