0%

预定义变量

Shell 预定义变量:系统内置的实用变量详解

在 Shell 脚本中,除了用户自定义变量和位置参数变量,还有一些由系统预先定义的变量(预定义变量),它们用于获取进程状态、命令执行结果等关键信息,是编写健壮脚本的重要工具。以下是最常用的三个预定义变量的详细解析。

$$$$:当前进程的 PID(进程号)

作用

返回当前 Shell 脚本或进程的进程 ID(PID),唯一标识当前运行的进程。

适用场景

  • 记录脚本运行日志时标记进程;
  • 创建临时文件时使用 PID 作为文件名(避免重名);
  • 脚本中需要引用自身进程 ID 的场景。

示例

1
2
3
4
5
6
7
8
9
#!/bin/bash
# 文件名:show_pid.sh

echo "当前脚本的 PID 是:$$"

# 使用 PID 创建临时文件(避免与其他进程冲突)
temp_file="/tmp/my_script_$$.txt"
echo "临时文件路径:$temp_file"
touch "$temp_file"

执行脚本:

1
sh show_pid.sh

输出:

1
2
当前脚本的 PID 是:12345
临时文件路径:/tmp/my_script_12345.txt

说明:每次执行脚本的 PID 不同,因此临时文件不会重名,确保安全性。

$!:后台运行的最后一个进程的 PID

作用

返回最后一个放入后台运行的进程的 PID,用于跟踪或管理后台进程。

适用场景

  • 启动后台服务后,记录其 PID 以便后续停止或监控;
  • 批量启动多个后台进程时,获取最近一个进程的 ID。

示例

1
2
3
4
5
6
7
8
9
#!/bin/bash
# 文件名:bg_process.sh

# 启动一个后台进程(如睡眠60秒)
sleep 60 &
echo "后台进程的 PID 是:$!"

# 后续可通过该 PID 操作进程(如终止)
# kill $!

执行脚本:

1
sh bg_process.sh

输出:

1
后台进程的 PID 是:12346

说明& 表示将命令放入后台运行,$! 立即捕获其 PID。

$?:最后一条命令的退出状态码

作用

返回上一条命令执行后的退出状态码,用于判断命令是否执行成功:

  • 0:命令执行成功;
  • 非 0(1~255):命令执行失败(不同数值对应不同错误类型)。

适用场景

  • 脚本中判断前序命令是否执行成功(如文件操作、服务启动);
  • 错误处理(如命令失败时输出提示并退出)。

示例 1:基础用法

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# 文件名:check_status.sh

# 尝试创建目录
mkdir test_dir
echo "mkdir 命令的退出状态:$?" # 成功则输出 0

# 尝试删除不存在的文件
rm no_such_file.txt
echo "rm 命令的退出状态:$?" # 失败则输出非 0(如 1)

执行脚本:

1
sh check_status.sh

输出:

1
2
3
mkdir 命令的退出状态:0
rm: 无法删除 'no_such_file.txt': 没有那个文件或目录
rm 命令的退出状态:1

示例 2:结合条件判断

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# 文件名:safe_copy.sh

# 复制文件,若失败则提示并退出
cp source.txt dest.txt

if [ $? -eq 0 ]; then
echo "文件复制成功!"
else
echo "文件复制失败!"
exit 1 # 以非 0 状态退出脚本
fi

说明:通过 $? 可在脚本中实现自动化错误处理,确保流程可控。

预定义变量对比与总结

变量 含义 典型用途
$$$$ 当前进程 PID 生成唯一临时文件、日志标记
$! 最后一个后台进程 PID 管理后台服务(启动 / 停止)
$? 最后命令的退出状态 判断命令执行结果、错误处理

实用技巧

  1. $? 的简化写法
    无需显式赋值,可直接在条件中使用:

    1
    2
    3
    4
    5
    if cp source.txt dest.txt; then
    echo "复制成功"
    else
    echo "复制失败"
    fi
  2. 后台进程管理
    结合 $!wait 命令等待后台进程完成:

    1
    2
    3
    4
    5
    sleep 10 &
    bg_pid=$!
    echo "等待进程 $bg_pid 完成..."
    wait $bg_pid # 等待后台进程结束
    echo "进程已完成,退出状态:$?"
  3. 避免 PID 冲突
    在脚本中创建临时文件时,优先使用 $$$$ 作为文件名后缀,如:

    1
    2
    temp_dir="/tmp/script_$$_dir"
    mkdir "$temp_dir"

欢迎关注我的其它发布渠道