Linux脚本自动化需注重细节:①用#!/usr/bin/env bash确保解释器兼容;②chmod +x加执行权限并用绝对路径或cd到脚本目录;③开头加set -euo pipefail防静默失败;④变量抽离、参数化及敏感信息外置,遵循最小信任原则。

Linux脚本自动化不是写完就能跑,关键在细节和习惯。很多新手脚本看似能执行,但一上生产就出问题——权限、路径、环境、退出码,一个没处理好就“静默失败”。下面说几个最常踩的坑,附带怎么绕过去。
脚本开头不加 shebang 或写错解释器
很多人直接写 #!/bin/bash,但有些系统默认用 dash(比如 Ubuntu),或者 bash 装在 /usr/bin/bash。脚本没指定解释器,或指定错了,就会用 sh 运行,结果语法报错(比如 [[ ]]、数组、source 行为异常)。
- 用
#!/usr/bin/env bash更兼容,它会自动找 PATH 里的 bash - 确认目标机器 bash 路径:运行
which bash看一眼 - 避免用
#!/bin/sh写 bash 特性,sh 不一定支持
忽略执行权限和调用方式
脚本保存后直接 ./script.sh 报 “Permission denied”,或者用 bash script.sh 能跑,但用 ./script.sh 就不行——本质是忘了加执行权限,或路径写死成相对路径导致在别处调用失败。
- 加权限:运行
chmod +x script.sh - 脚本内所有路径尽量用绝对路径,或用
$(dirname "$(readlink -f "$0")")获取脚本所在目录 - 别依赖当前工作目录,cd 到脚本目录开头加一句:
cd "$(dirname "$(readlink -f "$0")")" || exit 1
不检查命令是否成功,静默跳过错误
比如 cp file /dest && echo "done",如果 cp 失败,echo 还是会执行。更糟的是整个脚本没设 set -e,一条命令失败,后续还继续跑,结果越错越多。
- 开头加
set -euo pipefail:-e(出错退出)、-u(引用未定义变量报错)、-o pipefail(管道中任一命令失败整体算失败) - 关键步骤后手动检查:
some_cmd || { echo "some_cmd failed"; exit 1; } - 用
$?判断上条命令返回值,但优先用set -e简化逻辑
硬编码用户名、路径、IP,无法复用
脚本里写死 /home/alex/logs/ 或 ssh user@192.168.1.100,换台机器就得改代码。这不是自动化,是“复制粘贴自动化”。
- 把可变项抽成变量,顶部集中定义:
LOG_DIR="/var/log/myapp" - 用参数传入:比如
./deploy.sh --env prod --host 10.0.2.5,配合getopts或简单位置参数处理 - 敏感信息(密码、密钥)不要写进脚本,用环境变量或配置文件(注意权限
chmod 600)
基本上就这些。脚本写得再短,只要跑在别人机器上、跑在定时任务里、跑在部署流程中,就得按“最小信任原则”来:假设环境不可靠、用户不一致、网络会断、磁盘会满。防住这些,才算真自动化。









