Для цикла, который делает разные вещи для каждого файла

Я пытаюсь сделать цикл for для JPG-изображений, чтобы добавить их в html-код с различными свойствами для каждого изображения. Я хочу иметь возможность изменять содержимое HTML-кода для каждого трех изображений. Вот текущий код:

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

Я хочу, чтобы цикл for заменил ${file} таким образом, что первое изображение центрировано, второе изображение справа, а третье изображение осталось. Затем четвертое изображение центрируется, пятое - справа, а шестое - слева. И так далее, пока все изображения не будут помещены в таблицу. Поэтому в основном измените содержимое кота для каждого 3 файла в цикле. Есть ли способ сделать это?

0
задан 14 April 2017 в 06:54

4 ответа

Держите подсчет и проверьте 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 

Обратите внимание, что *.jpg может не оказаться в нужном порядке.

Теперь, когда мы знаем, желаемый результат, мы можем сгенерировать его более легко:

#! /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

Здесь переменная td_format является строкой формата для printf. %s в строке формата заменяется аргументами на printf (и %% на %). printf перебирает аргументы, поэтому нам нужно только указать формат одного элемента, а printf позаботится о том, чтобы перебрать аргументы, чтобы напечатать достаточно строк.

Затем мы устанавливаем аргументы сценария имена файлов. Теперь мы можем получить доступ к этим именам, используя $1, $2 и т. Д. В цикле я использую $1, $2 и $3, затем удаляю эти три, используя shift 3. Затем следующие три имени файла становятся $1, $2 и $3 соответственно. Итак, мы можем выполнить цикл из трех.

Наконец, вместо перенаправления каждой команды я завернул весь блок в { } и перенаправил эту группу.

Вероятно, вы должны переосмыслить HTML и стили, используемые здесь.

1
ответ дан 22 May 2018 в 23:40
  • 1
    Спасибо, сэр! Это работает как шарм! & Л; 3! Потому что я учусь, я могу задать другой вопрос? Как вы думаете, можно ли сделать то же самое в цикле for, который вложен в цикл while? Если да, не могли бы вы продемонстрировать это? Я пытаюсь сделать и хотел бы сравнить свой код с экспертом. Спасибо еще раз! & Lt; 3 – He-is-learning 14 April 2017 в 06:15
  • 2
    @ Он-учит, что именно вы пытаетесь сделать? Я бы избегал вложенных циклов, и код, который я дал в ответ, не так уж хорош. Если вы можете описать фактическую цель, было бы легче сделать это – muru 14 April 2017 в 06:25
  • 3
    Я просто обновил вопрос, чтобы точно показать, что я пытаюсь сделать. Не могли бы вы также изменить свой ответ соответственно? Извините, что я не делал этого в оригинальном вопросе, потому что я думал, что добавление html-кода может сделать его слишком грязным. Я буду придерживаться вашего обновленного ответа, так как вы эксперт. Однако мне интересно, почему бы вам избежать вложенных циклов. Они занимают больше памяти? Помедленнее? Более сложный или менее элегантный? Или программист догадался? – He-is-learning 14 April 2017 в 06:58
  • 4
    @ Он - обучение медленнее, сложнее, менее элегантно. См. Обновление. – muru 14 April 2017 в 09:18

Держите подсчет и проверьте 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

Обратите внимание, что *.jpg может не оказаться в нужном порядке.

Теперь, когда мы знаем, желаемый результат, мы можем сгенерировать его более легко:

#! /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

Здесь переменная td_format является строкой формата для printf. %s в строке формата заменяется аргументами на printf (и %% на %). printf перебирает аргументы, поэтому нам нужно только указать формат одного элемента, а printf позаботится о том, чтобы перебрать аргументы, чтобы напечатать достаточно строк.

Затем мы устанавливаем аргументы сценария имена файлов. Теперь мы можем получить доступ к этим именам, используя $1, $2 и т. Д. В цикле я использую $1, $2 и $3, затем удаляю эти три, используя shift 3. Затем следующие три имени файла становятся $1, $2 и $3 соответственно. Итак, мы можем выполнить цикл из трех.

Наконец, вместо перенаправления каждой команды я завернул весь блок в { } и перенаправил эту группу.

Вероятно, вы должны переосмыслить HTML и стили, используемые здесь.

1
ответ дан 18 July 2018 в 15:01

Держите подсчет и проверьте 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

Обратите внимание, что *.jpg может не оказаться в нужном порядке.

Теперь, когда мы знаем, желаемый результат, мы можем сгенерировать его более легко:

#! /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

Здесь переменная td_format является строкой формата для printf. %s в строке формата заменяется аргументами на printf (и %% на %). printf перебирает аргументы, поэтому нам нужно только указать формат одного элемента, а printf позаботится о том, чтобы перебрать аргументы, чтобы напечатать достаточно строк.

Затем мы устанавливаем аргументы сценария имена файлов. Теперь мы можем получить доступ к этим именам, используя $1, $2 и т. Д. В цикле я использую $1, $2 и $3, затем удаляю эти три, используя shift 3. Затем следующие три имени файла становятся $1, $2 и $3 соответственно. Итак, мы можем выполнить цикл из трех.

Наконец, вместо перенаправления каждой команды я завернул весь блок в { } и перенаправил эту группу.

Вероятно, вы должны переосмыслить HTML и стили, используемые здесь.

1
ответ дан 24 July 2018 в 20:32

Держите подсчет и проверьте 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

Обратите внимание, что *.jpg может не оказаться в нужном порядке.

Теперь, когда мы знаем, желаемый результат, мы можем сгенерировать его более легко:

#! /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

Здесь переменная td_format является строкой формата для printf. %s в строке формата заменяется аргументами на printf (и %% на %). printf перебирает аргументы, поэтому нам нужно только указать формат одного элемента, а printf позаботится о том, чтобы перебрать аргументы, чтобы напечатать достаточно строк.

Затем мы устанавливаем аргументы сценария имена файлов. Теперь мы можем получить доступ к этим именам, используя $1, $2 и т. Д. В цикле я использую $1, $2 и $3, затем удаляю эти три, используя shift 3. Затем следующие три имени файла становятся $1, $2 и $3 соответственно. Итак, мы можем выполнить цикл из трех.

Наконец, вместо перенаправления каждой команды я завернул весь блок в { } и перенаправил эту группу.

Вероятно, вы должны переосмыслить HTML и стили, используемые здесь.

1
ответ дан 31 July 2018 в 23:34

Другие вопросы по тегам:

Похожие вопросы: