You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:53:26