Shell 位置参数变量:处理命令行传参的实用指南
在 Shell 脚本中,位置参数变量用于接收和处理命令行传入的参数,是实现脚本灵活性和复用性的关键。无论是简单的参数传递还是复杂的批量处理,掌握位置参数变量都能高效完成任务。以下是详细解析和示例。
基础位置参数变量
1. $n
:按序号获取参数
$0
:表示脚本本身的名称(包含路径时显示完整路径)。$1~$9
:表示第 1 到第 9 个参数。${10}
及以上:10 个以上的参数需用大括号包裹(如${10}
、${11}
)。
示例:params.sh
脚本
1 |
|
执行脚本:
1 | sh params.sh a b c d e f g h i j k |
输出:
1 | 脚本名称:params.sh |
2. $#
:获取参数总数
- 表示命令行传入的参数总个数(不包含脚本名称
$0
)。
示例:统计参数个数
1 |
|
执行脚本:
1 | sh count_params.sh 1 2 3 |
批量处理所有参数
1. $*
与 $@
:获取所有参数
两者都表示命令行中的所有参数,但处理方式不同:
$*
:将所有参数视为一个整体字符串(用空格分隔)。$@
:将每个参数视为独立的字符串(保留参数边界)。
示例:对比 $*
和 $@
1 |
|
执行脚本:
1 | sh all_params.sh a "b c" d |
输出:
1 | 使用 $* 遍历: |
结论:遍历参数时优先使用 $@
,能正确保留包含空格的参数。
2. 截取部分参数
通过 ${@:起点}
或 ${@:起点:个数}
可截取部分参数:
${@:n}
:从第n
个参数开始,获取后面所有参数(n
从 1 开始)。${@:n:m}
:从第n
个参数开始,获取m
个参数。
示例:截取参数
1 |
|
执行脚本:
1 | sh slice_params.sh 10 20 30 40 50 |
输出:
1 | 所有参数:10 20 30 40 50 |
特殊变量 $?
:获取执行状态
$?
用于获取上一条命令的退出状态码:
0
:命令执行成功。- 非 0:命令执行失败(不同数值表示不同错误类型)。
示例:检查命令执行结果
1 |
|
执行脚本:
1 | sh check_status.sh |
实际应用案例
1. 简单计算器脚本
接收两个数字和一个运算符,计算结果:
1 |
|
执行脚本:
1 | sh calculator.sh 15 + 35 |
2. 批量文件重命名
将指定目录下的所有.txt
文件添加前缀(第一个参数为前缀,第二个参数为目录):
1 |
|
执行脚本:
1 | sh rename_files.sh "2025_" ./docs |
注意事项
- 参数边界处理:
脚本中应检查参数个数是否符合要求(如用if [ $# -lt N ]
),避免因参数缺失导致错误。 - 特殊字符处理:
若参数包含空格、星号(*
)等特殊字符,传入时需用双引号包裹(如sh script.sh "hello world"
)。 - 位置参数的偏移:
可通过shift
命令左移参数(如shift 2
表示丢弃前 2 个参数,$3
变为新的$1
),适合处理不定长参数
v1.3.10