在 Shell 脚本中,变量是存储和操作数据的基础单元。理解变量的定义规则、数据类型特性及特殊变量的应用,是实现脚本逻辑控制的核心前提。本节将从变量定义、命令替换和特殊变量三个维度展开详解。
变量定义遵循**“变量名=值”**的基本语法,等号前后严禁添加空格,这是 Shell 语法中最容易出错的细节之一。根据赋值内容的不同,变量可分为字符串型和数值型(Shell 中无需显式声明类型,统一按字符串处理,运算时自动转换),其中字符串变量的引号使用存在显著差异:
name="John"
echo "Hello, $name" # 输出:Hello, John(变量$name被解析为John)
echo 'Hello, $name' # 输出:Hello, $name($name被当作普通字符处理)
环境变量是一类特殊的全局变量,可通过 export 命令声明,使其在子进程中可见。常见用途包括扩展系统路径、配置运行环境等:
export PATH=$PATH:/usr/local/bin # 将自定义工具路径添加到系统可执行路径
echo $HOME # 输出当前用户家目录(如/root或/home/username)
echo $USER # 输出当前登录用户名(如root)
echo $PWD # 输出当前工作目录(如/opt/project)
注意事项
count=100,但参与运算需使用$(( ))语法(如$((count+1)))。~/.bashrc或/etc/profile文件。命令替换用于将命令的执行结果赋值给变量,Shell 提供两种语法形式:
$(command),可读性更强,支持嵌套使用。`command`(反引号),兼容性好但嵌套时需额外转义,易出错。实际应用中,$(command) 因清晰的边界和嵌套能力成为首选。例如,获取当前系统时间并格式化输出:
current_time=$(date +"%Y-%m-%d %H:%M:%S") # 捕获date命令的格式化输出
echo "当前系统时间:$current_time" # 输出:当前系统时间:2025-08-29 23:54:05(示例值)
嵌套场景下,$(command) 的优势尤为明显。例如,统计当前目录下 .log 文件的总行数:
log_line_count=$(wc -l $(find ./ -name "*.log") | tail -n 1 | awk '{print $1}')
echo "日志文件总行数:$log_line_count"
若使用反引号语法,需对内部命令的反引号进行转义(`wc -l \`find ./ -name "*.log"\` | ...),可读性和维护性显著下降。
Shell 预定义了一系列特殊变量,用于获取脚本运行时的上下文信息(如参数、进程ID、命令执行结果等)。以下是最常用的特殊变量及其应用场景:
| 变量 | 描述 | 典型应用场景 |
|---|---|---|
| $0 | 当前脚本的文件名(含路径) | 脚本自我标识(如echo "当前脚本:$0") |
| $? | 上一条命令的退出状态码(0为成功,非0为失败) | 命令执行结果检查(如if [ $? -eq 0 ]) |
| $$ | 当前脚本的进程ID(PID) | 生成唯一临时文件名(如tmpfile=/tmp/$$.txt) |
| $1~$n | 脚本的第1至第n个位置参数 | 接收用户输入参数(如echo "第一个参数:$1") |
| $# | 位置参数的总个数 | 参数数量校验(如if [ $# -lt 2 ]; then exit 1; fi) |
| $@ | 所有位置参数的列表(可遍历) | 循环处理参数(如for arg in "$@"; do echo $arg; done) |
其中,$?(退出状态码) 是脚本错误处理的关键工具。例如,检查文件是否存在的脚本片段:
#!/bin/bash
file_path="/data/important.log"
if [ -f "$file_path" ]; then
echo "文件存在,开始处理..."
else
echo "错误:文件 $file_path 不存在"
exit 1 # 手动设置非0退出码,告知调用方执行失败
fi
if [ $? -eq 0 ]; then
echo "文件处理完成"
else
echo "文件处理失败,请检查日志"
fi
以下是包含多种特殊变量的综合示例脚本,可直观理解各变量的实际效果:
#!/bin/bash
echo "脚本名(含路径):$0"
echo "第1个参数:$1"
echo "参数总数:$#"
echo "所有参数列表:$@"
echo "当前脚本PID:$$"
echo -e "\n参数遍历结果:"
for arg in "$@"; do
echo " - $arg"
done
false # 该命令始终返回非0退出码
echo -e "\n上一条命令(false)的退出码:$?" # 输出:1
执行该脚本(如bash demo.sh arg1 arg2 arg3),输出如下:
脚本名(含路径):demo.sh
第1个参数:arg1
参数总数:3
所有参数列表:arg1 arg2 arg3
当前脚本PID:12345
参数遍历结果:
- arg1
- arg2
- arg3
上一条命令(false)的退出码:1
通过合理运用变量定义规则、命令替换语法和特殊变量,可构建逻辑清晰、健壮性强的 Shell 脚本,为 Linux 系统管理和自动化任务提供高效支持。