パラメータ配列のbashインデックスを取得するには?

パラメータ配列のbashインデックスを取得するには?

パラメータインデックスが必要です。

そしてダミー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

記録によると、zshindexOf関数は次のようになります。

$ 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)違います。

関連情報