在编写 Shell 脚本时,除了自定义变量,系统预定义的特殊变量同样不可或缺。它们能帮助我们快速获取脚本自身信息、命令行参数详情或执行状态。
常用特殊变量速查
- $0:当前脚本的文件名(包含路径)
- $n:第 n 个参数,例如 $1 是第一个参数
- $#:传递给脚本的参数总个数
- $*:所有参数,视为一个整体字符串
- $@:所有参数,视为独立的列表
- $?:上一个命令的退出状态(成功通常为 0,失败为 1)
- $$:当前 Shell 进程的 ID
$* 与 $@ 的区别
这两个变量都代表所有参数,但在未加引号时表现基本一致。真正的区别在于双引号的使用场景:
当使用 "$*" 时,所有参数会被合并为一个整体字符串,中间用空格分隔;而 "$@" 则会保持每个参数的独立性,即使参数中包含空格也不会被拆分。这在遍历函数参数或构建复杂命令时非常关键。
实战示例
下面的脚本演示了这些变量的具体用法,特别是 $* 和 $@ 在循环中的不同表现。
#!/bin/bash
echo "File name: $0"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "print each param from \"\$*\""
for var in "$*"; do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"; do
echo ""

