Linux Shell特殊位置参数变量包括:$0至$9及${10}+按位置取值;$#统计参数个数;"$@"安全遍历各参数,"$*"合并为单串;$?获上一命令退出码,$$得当前进程ID,$!获后台命令PID。

Linux Shell 脚本中,特殊位置参数变量是处理命令行输入的核心工具。它们不是普通变量,而是由 shell 自动设置、随脚本执行即时生效的只读标识,用对了能让脚本更健壮、更易维护。
$0、$1 到 $9、${10} 及以上:按位置取值
脚本名和前 9 个参数直接用 $0、$1…$9 访问。注意:$0 是脚本路径(可能含 ./ 或 /full/path),常用 basename $0 提取纯文件名。
第 10 个及以后的参数必须写成 ${10}、${11} 形式,写成 $10 会被解释为 “$1 的值拼上字符 0”,结果出错。
- 运行
./deploy.sh app v1.2 prod /tmp/logs true debug -
$0 → ./deploy.sh,$1 → app,$2 → v1.2,$5 → true,${10} → debug
$#、$@、$*:统计与遍历所有参数
$# 返回参数总个数,常用于校验输入是否足够:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
if [ $# -lt 2 ]; then echo "至少需要两个参数"; exit 1; fi
$@ 和 $* 都代表全部参数,但行为关键不同:
-
"$@"把每个参数当独立字符串处理,保留空格和引号,适合安全遍历 -
"$*"把所有参数合并成单个字符串(用第一个 IFS 字符分隔,默认为空格),容易破坏含空格的路径 - 推荐遍历统一用:
for arg in "$@"; do echo "got: $arg"; done
$?、$$、$!:获取上下文状态与进程信息
这些变量不参与用户输入,但对脚本逻辑控制至关重要:
-
$? 是上一条命令的退出码 ——
0表示成功,非0表示失败,应紧跟在关键命令后检查 -
$$ 是当前脚本进程 ID,可用于生成唯一临时文件名,如
/tmp/myapp_${$$.log} -
$! 是最近一次后台启动命令的 PID,配合
&使用,比如sleep 300 &; echo "后台任务 PID: $!"
实际使用建议
写脚本时,注意三点:
- 所有位置参数变量尽量用双引号包裹,如
"$1",避免空格或通配符引发意外拆分 - 不要直接用
$10,第 10 个参数一定是${10} - 调试时可加一行
echo "Called as: $0, args: $#, all: $@"快速确认输入状态

















