Rodar figuras ímpares

1

Eu escrevo um pequeno script para rotacionar todas as figuras ímpares de um diretório, mas não consigo fazê-lo funcionar. Aqui está o código.

#!/bin/bash

count=1

for picture in 'ls -v *.png'
do
    if ["$picture" == "picture_$count.png"]
    then
        mogrify -rotate 90 "$picture"
        count=$(($count+2))
    fi
done

Alguma sugestão?

    
por Viviño 12.09.2017 / 16:20

4 respostas

5

Não analise ls .

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

    
por 12.09.2017 / 20:00
1

Seu script não está funcionando porque na linha 7 você precisa de um espaço depois de [ e um antes de ] .
Por exemplo:

if [ "$picture" == "picture_$count.png" ]

Além disso, seu script atual funciona apenas enquanto nenhum número ímpar foi deixado de fora.

    
por 12.09.2017 / 18:52
0
max=$(ls *.png | sort -n | tail  -1 | xargs basename -s .png)
for f in seq 1 2 $max
do
    mogrify -rotate 90 $f.png
done
    
por 12.09.2017 / 19:58
0

Finalmente, encontro os erros no script:

  • Primeiro, o espaço depois de [ e antes de ] , comentou aqui e aqui.
  • Em segundo lugar, graças aos comentários a minha pergunta de MariusMatutiae e Moses, altero a linha sete de if ["$picture" == "picture_$count.png"] para if [ $picture == pagina_$count.png ] excluindo " .

Aqui está o script final.

#!/bin/bash

count=1

for picture in 'ls -v *.png'
do
    if [ $picture == picture_$count.png ]
    then
        mogrify -rotate 90 "$picture"
        count=$(($count+2))
    fi
done
    
por 13.09.2017 / 15:37