linux脚本 自动化 关键在细节和习惯:需动态获取路径、明确解释器、处理空变量、设 严格模式、适配 cron 环境。核心是让脚本可移植、健壮、易排查。

Linux 脚本自动化不是写完就能跑,关键在细节和习惯。很多新手把脚本当命令行记录来写,结果一换环境就报错、一加 参数就崩、一放后台就失联——问题往往不出在语法,而在设计逻辑和执行上下文。
路径写死 = 脚本只活在你 电脑 上
绝对路径(如 /home/you/project/data.txt)让脚本失去移植性。一旦换个用户、换台机器、甚至只是改了目录名,脚本就找不到文件。
- 用 $0 和 dirname 动态获取脚本所在目录:script_dir=$(cd “$(dirname “$0″)” && pwd)
- 所有依赖文件路径基于 $script_dir 构建,比如 $script_dir/conf/config.ini
- 避免用 ~ 或 $HOME 直接拼路径,cron 或 sudo 下可能不生效
忽略执行权限和解释器声明
脚本没加 x 权限,或第一行少了 #!/bin/bash,系统就不知道怎么运行它——尤其用 ./xxx.sh 执行时静默失败,容易误以为“脚本没反应”。
- 保存后立刻加权限:chmod +x script.sh
- 首行必须明确指定解释器,推荐用 #!/usr/bin/env bash(比硬写 /bin/bash 更兼容不同发行版)
- 别用 windows 编辑器保存,换行符 CRLF 会导致 ^M: command not found 错误,用 dos2unix 修复
不处理变量空值和未定义行为
比如 rm -rf $DIR/*,如果 $DIR 为空或未设置,就变成 rm -rf /* ——这不是夸张,是真实删库现场。
- 启用严格模式:set -euo pipefail(-e 中断错误,-u 拒绝未定义变量,-o pipefail 让管道任一环节失败都报错)
- 给变量设默认值:${DIR:-/tmp};检查必填变量:[-z “$API_KEY”] && {echo “API_KEY missing”; exit 1; }
- 路径变量用双引号包裹:cp “$SRC_FILE” “$DEST_DIR/”,防止含空格路径被拆开
定时任务里忘了 环境变量 和工作目录
crontab 默认 PATH 很窄(通常只有 /usr/bin:/bin),且不加载你的 ~/.bashrc,所以脚本里用的命令(如 python3、jq)可能根本找不到;同时当前目录是 root 用户家目录,不是脚本所在目录。
- 在 crontab 里显式定义 PATH:PATH=/usr/local/bin:/usr/bin:/bin
- 脚本开头主动 cd 到工作目录:cd “$(dirname “$0″)” || exit
- 必要时在 cron 条目中用 bash -c 包裹,并 source 环境:0 * * * * cd /path/to && ./backup.sh
基本上就这些——不复杂,但容易忽略。脚本自动化真正的门槛不在语法多难,而在是否始终带着“别人也会用、换环境也要稳、出错了要能查”的意识去写每一行。