パラメータインデックスが必要です。
そしてダミー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)違います。