Em vez disso, deixe o shell pegar todos os arquivos com números ímpares para você. É mais seguro e simples:
#!/bin/bash
for picture in *[13579].png
do
mogrify -rotate 90 "$picture"
done
[] em um shell glob corresponde a qualquer um dos caracteres internos, portanto listando todos os dígitos ímpares, o padrão completo corresponde a qualquer arquivo no diretório atual que termine em odd_digit .png . Não é necessário manter uma contagem em execução e, como a expansão de nome de arquivo (ou seja, shell globbing) é a última coisa que acontece com uma linha de comando antes de ser executada, ela não será ativada por nomes de arquivo.
Quanto ao problema específico do seu script original, é como nullterminatedstring apontou, é necessário ter espaços ao redor do [ e ] na linha if . Isso porque [ não é alguma sintaxe especial para if , é apenas outro comando: /bin/[ , que é um sinônimo para o test comando. (Seu shell provavelmente fornece sua própria versão interna de [ , por motivos de desempenho, mas ainda deve se comportar da mesma maneira que o comando externo, incluindo todas as limitações de análise.)
Sem o espaço entre [ e "$picture" , você está dizendo a bash para executar um comando chamado algo como [picture_1.png com dois argumentos: == e picture_1.png] . Como você provavelmente não tem um comando chamado [picture_1.png em seu computador, seu script falha.
Com espaços em torno de [ e ] , você estaria executando o comando [ com quatro argumentos: picture_1.png , == , picture_1.png e ] .