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