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