eval é a única maneira portátil de acessar um parâmetro posicional por sua posição escolhida dinamicamente. Seu script seria mais claro se você explicitamente colocasse em loop o índice em vez dos valores (que você não está usando). Note que você não precisa de expr a menos que você queira que seu script seja executado em shells antigos da Bourne; $((…)) aritmética está em POSIX. Limite o uso de eval ao menor fragmento possível; por exemplo, não use eval echo , atribua o valor a uma variável temporária.
i=$#
while [ "$i" -gt 0 ]; do
if [ "$i" -ne 3 ] && [ "$i" -ne 2 ]; then
eval "value=\${$i}"
echo "Parameter $i is $value"
fi
i=$((i-1))
done
No bash, você pode usar ${!i} para significar o valor do parâmetro cujo nome é $i . Isso funciona quando $i é um parâmetro nomeado ou um número (denotando um parâmetro posicional). Enquanto você está nisso, você pode fazer uso de outros recursos convenientes bash.
for ((i=$#; i>0; i--)); do
if ((i != 3 && i != 4)); then
echo "Parameter $i is ${!i}"
fi
done