Shell 预定义变量:系统内置的实用变量详解
在 Shell 脚本中,除了用户自定义变量和位置参数变量,还有一些由系统预先定义的变量(预定义变量),它们用于获取进程状态、命令执行结果等关键信息,是编写健壮脚本的重要工具。以下是最常用的三个预定义变量的详细解析。
$$$$:当前进程的 PID(进程号)
作用
返回当前 Shell 脚本或进程的进程 ID(PID),唯一标识当前运行的进程。
适用场景
- 记录脚本运行日志时标记进程;
- 创建临时文件时使用 PID 作为文件名(避免重名);
- 脚本中需要引用自身进程 ID 的场景。
示例
1 |
|
执行脚本:
1 | sh show_pid.sh |
输出:
1 | 当前脚本的 PID 是:12345 |
说明:每次执行脚本的 PID 不同,因此临时文件不会重名,确保安全性。
$!:后台运行的最后一个进程的 PID
作用
返回最后一个放入后台运行的进程的 PID,用于跟踪或管理后台进程。
适用场景
- 启动后台服务后,记录其 PID 以便后续停止或监控;
- 批量启动多个后台进程时,获取最近一个进程的 ID。
示例
1 |
|
执行脚本:
1 | sh bg_process.sh |
输出:
1 | 后台进程的 PID 是:12346 |
说明:& 表示将命令放入后台运行,$! 立即捕获其 PID。
$?:最后一条命令的退出状态码
作用
返回上一条命令执行后的退出状态码,用于判断命令是否执行成功:
0:命令执行成功;- 非 0(1~255):命令执行失败(不同数值对应不同错误类型)。
适用场景
- 脚本中判断前序命令是否执行成功(如文件操作、服务启动);
- 错误处理(如命令失败时输出提示并退出)。
示例 1:基础用法
1 |
|
执行脚本:
1 | sh check_status.sh |
输出:
1 | mkdir 命令的退出状态:0 |
示例 2:结合条件判断
1 |
|
说明:通过 $? 可在脚本中实现自动化错误处理,确保流程可控。
预定义变量对比与总结
| 变量 | 含义 | 典型用途 |
|---|---|---|
| $$$$ | 当前进程 PID | 生成唯一临时文件、日志标记 |
$! |
最后一个后台进程 PID | 管理后台服务(启动 / 停止) |
$? |
最后命令的退出状态 | 判断命令执行结果、错误处理 |
实用技巧
$?的简化写法:
无需显式赋值,可直接在条件中使用:1
2
3
4
5if cp source.txt dest.txt; then
echo "复制成功"
else
echo "复制失败"
fi后台进程管理:
结合$!和wait命令等待后台进程完成:1
2
3
4
5sleep 10 &
bg_pid=$!
echo "等待进程 $bg_pid 完成..."
wait $bg_pid # 等待后台进程结束
echo "进程已完成,退出状态:$?"避免 PID 冲突:
在脚本中创建临时文件时,优先使用 $$$$ 作为文件名后缀,如:1
2temp_dir="/tmp/script_$$_dir"
mkdir "$temp_dir"