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 ]
.