如何遍历Bash特殊数组$@的索引?简洁方法探讨
问题
在Bash里创建数组,比如:
ARR=(apple banana blueberry)
可以用${!ARR[@]}拿到数组索引,轻松遍历索引,示例如下:
for i in ${!ARR[@]}; do echo "[$i]=${ARR[$i]}" done
那怎么对${@}做同样的索引遍历操作?
我一开始试着用类似的写法:
__fn(){ for i in ${!@}; do echo "\[$i\]=${@\[$i\]}"; done; }
结果报了“Bad Substitution”错误。
目前我临时的解决办法是把位置参数复制成数组ARRAY=( "${@}" ),但想找个更优雅的实现方式。
补充说明:我要的不是访问第n个元素,而是遍历${@}的所有索引。
解决方法
Bash里${@}是特殊的位置参数列表,没法像普通命名数组那样用${!@}直接获取索引,不过有两种更优雅的实现方式:
方法1:直接遍历位置参数的索引范围
位置参数的索引从1开始,总个数由$#表示,直接循环1到$#的数值即可:
__fn(){ for ((i=1; i<=$#; i++)); do echo "[$i]=${!i}" done }
这里的${!i}是间接引用语法,用来获取第i个位置参数的值。
方法2:简洁的临时数组写法
如果偏好类似普通数组的遍历逻辑,可以用局部临时数组来承接位置参数,写法更直观:
__fn(){ local -a args=("$@") for i in "${!args[@]}"; do echo "[$((i+1))]=${args[$i]}" done }
注:因为Bash数组默认从0开始索引,这里用$((i+1))转换为位置参数的1起始索引格式。
为什么最初的代码报错?
${!arr[@]}是专门给命名数组设计的索引展开语法,而$@是位置参数列表,不属于命名数组范畴,所以${!@}是无效语法,直接触发“Bad Substitution”错误。
内容的提问来源于stack exchange,提问作者Ágatha Isabelle Moreira
相关产品推荐
相关产品推荐

