如何获取参数数组的 ba​​sh 索引?

如何获取参数数组的 ba​​sh 索引?

我想要参数索引,

并可以通过 dummy var 获取它:

dummy=( $@ )
echo ${!dummy[@]}

但有没有直接的方法可以得到它们,比如

$!@ ... not working
$!* ... not working

... 或类似的东西?

注意:我想要没有 arr var 的原始函数是这样的:

function indexof()
{  search="$1"; shift; arr=( $@ ) 
   for i in "${!arr[@]}"; do [ "$search" == "${arr[$i]}" ] && return $i; done
   return -1
}

答案1

您可以根据参数数量进行计算:

seq ${#@}

答案2

您不需要虚拟数组。您可以使用计数器变量:

indexof() {
    search="$1"; shift
    i=0
    for arg; do
        [ "$search" = "$arg" ] && return $i
        ((i++))
    done
    return -1
}

请注意,默认情况下for arg; do使用,这就是为什么可以省略。"$@"in "$@"

答案3

根据记录,在 中zsh,indexOf 功能是:

$ set foo bar baz bar foo
$ echo $@[(i)bar] $@[(I)bar]
2 4

$2是个第一的匹配(使用下i标标志),$4最后的匹配(I下标标志))。

答案4

您可以改用“arithmetic-for”形式:

indexof(){ search=$1; shift 
    for(( i=1; i<=$#; i++ )); do [[ $search == ${!i} ]] && return $i; done
    return -1 # as an old LISPer I'd prefer 0 for the notfound case
}

不是特别好(IMO)但不同。

相关内容