linux shell 编程:位置参数详解:$0 $1 $2 $* $@ $# $$ $? $! 作者:马育民 • 2026-09-24 11:13 • 阅读:10003 # 介绍 这些是 shell 的**特殊内置变量**,常用于脚本传参、获取脚本名、进程号、返回码等。下面逐个说明,附带示例。 # 1. 位置参数 脚本传入参数,假设脚本 `test.sh`,执行命令: ```bash bash test.sh apple banana cat ``` **解释:** - `$0`:**脚本本身名称** - 如果是 `bash test.sh` → `$0` = `test.sh` - 如果是绝对路径 `/root/test.sh` → `$0` = `/root/test.sh` - `$1`:第1个参数 → `apple` - `$2`:第2个参数 → `banana` - `$3`:第3个参数 → `cat` - `${10}`:第10个参数。**大于9必须加大括号**,`$10`会被解析成`$1`拼接`0`。 # 2. 参数集合:`$*` 和 `$@`(重点,容易混淆) 不加引号时,两者效果基本一样;**加双引号后行为完全不同** - `$*`:把所有参数当成**单个字符串**,参数之间用`IFS`(默认空格)分隔 `"$*"` → `"apple banana cat"`(**一个整体**) - `$@`:保留每个参数独立,**每个参数单独引号包裹** `"$@"` → `"apple"` `"banana"` `"cat"`(**多个独立参数**) ✅ 推荐遍历参数用:`for arg in "$@"`,可以正确处理带空格的参数。 ### 例子 ```bash #!/bin/bash for i in "$*"; do echo "参数: $i"; done echo "---------" for i in "$@"; do echo "参数: $i"; done ``` 调用:`bash test.sh "a b" c` ``` 参数: a b c --------- 参数: a b 参数: c ``` # 3. $#:传入参数的**个数**(不包含 $0) 上面例子 `bash test.sh apple banana cat`,`$#` → `3` # 4. 进程相关 - `$$`:当前 shell **进程PID**。脚本里就是脚本运行进程号。 - `$!`:**上一个后台进程的PID**(`&` 放到后台的命令) ```bash sleep 10 & echo $! # 输出sleep的pid ``` # 5. 返回状态码 `$?`:**上一条命令的退出码** - `0`:命令执行成功 - 非0:失败 ### 例子 ```bash ls /nonexist echo $? # 输出非0,代表失败 ``` > 注意:`$?` 只保存最近一条命令结果,一旦执行新命令就会被覆盖。 # 6. 其他特殊变量 - `$_`:上一条命令**最后一个参数** ```bash echo hello world echo $_ # world ``` - `$-`:当前shell的选项标志(set的参数,如hB) - `$PPID`:当前进程的父进程PID(不是所有shell都支持,bash有) # 汇总表 |变量|含义| |---|---| |`$0`|脚本文件名| |`$1,$2...`|第1、2…个位置参数| |`${n}`|n≥10时,第n个参数,必须加大括号| |`$#`|参数总个数(不含$0)| |`$*`|所有参数,双引号下合并为1个字符串| |`$@`|所有参数,双引号下保持参数独立(推荐)| |`$$`|当前shell进程PID| |`$!`|最近后台运行进程PID| |`$?`|上一条命令退出返回码,0成功| |`$_`|上一条命令最后一个参数| # 完整测试脚本 demo.sh ```bash #!/bin/bash echo "\$0 = $0" echo "\$1 = $1" echo "\$2 = $2" echo "\$# = $#" echo '========== "$*" ==========' for p in "$*"; do echo "[$p]"; done echo '========== "$@" ==========' for p in "$@"; do echo "[$p]"; done echo "\$\$ = $$" echo "\$? = $?" ``` 运行:`bash demo.sh "hello world" test 123` 原文出处:/show_1GW46acrhEd9.html