Bash中如何结合参数间接扩展与算术扩展单行获取指定位置参数?
Bash 单行获取指定位置参数实现方案
需求背景
现有脚本需要实现:跳过由SKIP变量定义数量的前置可选参数,取后续两个固定位置参数(即全参数列表的倒数两个)。原实现需要先计算参数位置序号存入临时变量,再通过间接扩展取值,写法冗余,示例原代码如下:
#!/bin/bash SKIP=1 # 取倒数第二个参数 V1=$(( SKIP+1 )) A1=${!V1} # 取最后一个参数 V2=$(( SKIP+2 )) A2=${!V2} echo A1 is $A1 echo A2 is $A2
执行命令./test a b c时,原脚本输出结果为:
A1 is b A2 is c
最优实现:直接用位置参数切片
Bash原生支持位置参数切片语法,可直接在参数展开内写入算术表达式计算起始位置,完全不需要临时变量存序号,单行即可完成取值:
#!/bin/bash SKIP=1 A1=${@:SKIP+1:1} A2=${@:SKIP+2:1} echo A1 is $A1 echo A2 is $A2
语法说明
${@:起始索引:长度}是Bash标准的参数切片语法,对位置参数和普通数组都生效:@代表当前所有位置参数的集合- 起始索引位置支持直接写算术表达式,Bash会自动求值,不需要额外嵌套
$(( )) - 长度字段传1时,仅返回对应索引的单个参数值
- 该语法兼容Bash 3.0及以上版本,覆盖绝大多数主流发行版、macOS的默认Bash环境,可读性远高于间接扩展写法。
其他可选写法:嵌套间接扩展
如果偏好沿用原有的间接扩展逻辑,也可以把算术扩展直接嵌套在间接扩展语法内,省略临时变量:
A1=${!$((SKIP+1))} A2=${!$((SKIP+2))}
该写法效果和原逻辑完全一致,但可读性较差,非特殊场景不推荐使用。
内容的提问来源于stack exchange,提问作者EML
相关产品推荐
相关产品推荐

