Para loop que faz coisas diferentes para cada arquivo

0

Eu estou tentando fazer um loop for para imagens JPG para adicioná-los em código html com propriedades diferentes para cada imagem. Eu quero ser capaz de alterar o conteúdo do código html para cada três imagens. Aqui está o código atual:

for file in *.jpg
do
cat >> page.html << _EOF
<table class="super-centered"><tr><td style="width:100%;height:100%;" align="center" valign="middle" > <img alt="" src="${file}"> </td></tr></table>
<table class="super-centered"><tr><td style="width:100%;height:100%;" align="right" valign="right" > <img alt="" src="${file}"> </td></tr></table>
<table> class="super-centered"><tr><td style="width:100%;height:100%;" align="left" valign="left" > <img alt="" src="${file}"> </td></tr></table>
_EOF
done

Eu quero que o loop for substitua ${file} de forma que a primeira imagem seja centralizada, a segunda imagem à direita e a terceira imagem à esquerda. Então a quarta imagem é centralizada, a quinta é a direita e a sexta é a esquerda. E assim por diante até que todas as imagens são colocadas na mesa.Por isso, basicamente, alterar o conteúdo do gato para cada 3 arquivos no loop. Existe uma maneira de fazer isso?

    
por He-is-learning 14.04.2017 / 04:46

1 resposta

1

Mantenha uma contagem e verifique o case :

i=0
for file in *.jpg
do
    case $i in
        0)
            cat << _EOF
    code one
  </div>
_EOF
            ;;
        1)
            cat << _EOF
    code two
  </div>
_EOF
            ;;
        2)
            cat << _EOF
    code three
  </div>
_EOF
            ;;
    esac
    ((i = (i+1) % 3))
done >> page.html 

Observe que *.jpg pode não terminar com a ordem desejada.

Agora que sabemos o resultado desejado, podemos gerá-lo mais facilmente:

#! /bin/bash
td_format='
    <td style="width:100%%;height:100%%;" align="%s" valign="%s" > <img alt="" src="%s"> </td>
'

set -- *.jpg

{
    echo '<table class="super-centered">'
    while [[ -n $1 ]]
    do
        echo '  <tr>'
        printf "$td_format" center middle "$1" right right "$2" left left "$3" 
        echo '  </tr>'
        shift 3
    done
    echo '</table>'
}> page.html

Aqui, a variável td_format é uma string de formato para printf . %s na string de formato é substituído por argumentos para printf (e %% por % ). printf faz um loop sobre argumentos, portanto, só precisamos especificar o formato de um elemento aqui, e printf cuidará do loop sobre os argumentos para imprimir linhas suficientes.

Em seguida, definimos os argumentos do script para os nomes dos arquivos. Agora, podemos acessar esses nomes de arquivos usando $1 , $2 , etc. No loop, eu uso $1 , $2 e $3 e, em seguida, removo esses três usando shift 3 . Em seguida, os próximos três nomes de arquivos se tornarão $1 , $2 e $3 , respectivamente. Então, podemos fazer um loop em lotes de três.

Por fim, em vez de redirecionar todos os comandos, envolvi o bloco inteiro em { } e redirecionei esse grupo.

Você provavelmente deve repensar o HTML e o estilo usados aqui.

    
por muru 14.04.2017 / 04:57