For循环对每个文件执行不同的操作

For循环对每个文件执行不同的操作

我正在尝试为 JPG 图像创建一个 for 循环,以便将它们添加到 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 个文件的 cat 内容。有办法吗?

答案1

保持计数并检查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 和样式。

相关内容