Você pode calcular a partir do número de argumentos:
seq ${#@}
eu quero índices de parâmetros,
e pode obtê-lo por dummy var:
dummy=( $@ )
echo ${!dummy[@]}
mas existe uma maneira direta de obtê-los, algo como
$!@ ... not working
$!* ... not working
... ou algo parecido?
NOTA: a função original que eu quero ter sem arr var é esta:
function indexof()
{ search="$1"; shift; arr=( $@ )
for i in "${!arr[@]}"; do [ "$search" == "${arr[$i]}" ] && return $i; done
return -1
}
Você pode usar o formulário '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
}
Não é particularmente melhor (IMO), mas diferente.
Você não precisa de um array fictício. Você pode usar uma variável de contador:
indexof() {
search="$1"; shift
i=0
for arg; do
[ "$search" = "$arg" ] && return $i
((i++))
done
return -1
}
Observe que for arg; do
usa "$@"
por padrão, é por isso que in "$@"
pode ser omitido.