![For循环对每个文件执行不同的操作](https://linux22.com/image/892375/For%E5%BE%AA%E7%8E%AF%E5%AF%B9%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E6%89%A7%E8%A1%8C%E4%B8%8D%E5%90%8C%E7%9A%84%E6%93%8D%E4%BD%9C.png)
我正在尝试为 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 和样式。