Você chama seu script com
./script file_*.jpg jpg bak
Mas * é expandido antes de ser passado para o script. Supondo que você tenha os arquivos file_1.jpg , file_2.jpg e file_3.jpg em sua pasta, isso é o que é chamado:
./script file_1.jpg file_2.jpg file_3.jpg jpg bak
, o que significa que ${1} = file_1.jpg , ${2} = file_2.jpg e ${3} = file_3.jpg .
Pode ser melhor escrever o seu script de forma tal que (no seu exemplo): ${1} = jpg e ${2} = bak . Então você pode armazenar essas variáveis em seu script, invocar shift 2 para se livrar delas e fazer um loop sobre todos os argumentos posicionais simplesmente usando
for file; do
# do something
done