-- 作者 谢恩铭 转载请注明出处


《Linux探索之旅》全系列

内容简介


  1. 前言
  2. 成果展示
  3. 生成缩略图
  4. 我的答案
  5. 可能的优化
  6. 第五部分第八课预告

1. 前言


今天的封面图片是不是比较搞笑?哈哈... Linux Freedom (Linux 自由)。
我第一次看到这张 Linux 企鹅版自由女神像的时候,笑不动了。
好吧,我笑点低...

上一课 Linux探索之旅 | 第五部分第六课:一朝Shell函数倾,斗转星移任我行 中我们学习了 Shell 中很关键的知识点 :函数。

既然我们已经基本学完了 Shell 的基础知识,是时候实战演练一下了。

在这个练习中,我们将会综合运用之前学习过的一些 Shell 和 Linux 知识点。别忘了,我们在 Shell 程序中是可以调用 Linux 命令的,例如:

ls
cp
mv
grep
cut
mkdir
sort复制代码

还有 「管道、流、重定向」 ( Linux探索之旅 | 第三部分第二课:流、管道、重定向,三管齐下 )等等。

你也许还会在使用一些命令时忘了如何用,那你可以查一下命令的使用手册 ( Linux探索之旅 | 第二部分第八课:RTFM 阅读那该死的手册 )。

本练习需要实现的项目是:
创建一个网页,这个网页展示一系列图片 (有点像一个画廊,Gallery ),而展示的图片是存放在本地的一个文件夹里的。

说起来总比做起来简单,你将会发现这是个不小的挑战。

话休絮烦,我们开始吧。

2. 成果展示


首先,我们给脚本文件起名叫 gallery.sh (gallery 是英语「画廊」的意思)

对于这个练习的第一个版本,我们暂时把脚本文件放在一个目录中,这个目录包含了要展示的所有图片。

这个脚本会为我们生成一个 HTML 文件,这个 HTML 文件就是一个网页文件,用来展示这些图片。

因此,这个脚本需要依次做以下的事:

  1. 根据目录中的每张图片,生成对应缩略图。

  2. 生成一个 HTML 文件,把缩略图都插入其中。

  3. 给每张缩略图绑定一个链接,会链接到原始图片。

为了写出这个脚本,需要有一些前端的网络知识,比如 HTML。

如果对 Web 开发不是很了解,可以先去看看我的 《 Web 探索之旅 》这个电子书。

当然了,如果你没有前端的知识也不要紧,跟着我写就可以了。

给出一个 HTML5 的基本的图片例子代码:

<!DOCTYPE html>
<html><body><h2>Spectacular Mountain</h2>< img src="pic_mountain.jpg" alt="Mountain View" style="width:304px;height:228px;" ></body>
</html>复制代码

最终成品


你将要用脚本来生成的网页是像下面这样的:

你点击这 8 张图片中的任意一张,都会跳转到原始图片。

当然了,这只是初级版本,你可以优化。不过编程不就是循序渐进的嘛,首先做出一个可以运行的版本,之后再「添砖加瓦」。

3. 生成缩略图


这是个好问题。我们在 Linux 探索之旅 的过程中可没有学过如何为图片生成缩略图。

缩略图:
缩略图的英文是 thumbnail。代表网页上或计算机中图片经压缩方式处理后的小图,其中通常会包含指向完整尺寸的图片的超链接。

为了不让你纠结,我就告诉你我们要用到的命令吧。

其实有一个 convert 命令,就可以帮助我们从图片生成缩略图。

convert 是英语「转换」的意思。

convert 命令有好多参数,可以用来做很多事情。对于生成缩略图,我们需要用到的参数就是 -thumbnail 。前面说了,thumbnail 就是「缩略图」的意思。

我们的脚本接收一个参数,就是要生成的 HTML 的文件名。如果没有给出文件名,那么就用默认的 gallery.html。

好了,如果你有基本的 HTML 的知识。那么已经可以开始写了。如果还不知道 HTML,那么可以去看一下 W3C 推出的官方教程:

  • 英文版 :www.w3schools.com/html/defaul…
  • 中文版 :www.w3school.com.cn/html/index.…

4. 我的答案


我给出我的解法,你的代码当然不必和我一样,但我想基本原理是一样的。

#!/bin/bash# Verification of parameter
# If no parameter, use a default valueif [ -z $1 ]
thenoutput='gallery.html'
elseoutput=$1
fi# Preparation of files and foldersecho '' > $outputif [ ! -e thumbnails ]
thenmkdir thumbnails
fi# Beginning of HTML
echo '<!DOCTYPE html><head><title>My Gallery</title></head><body><p>' >> $output# Generation of thumbnails and the HTML web page
for image in `ls *.jpg *.png *.jpeg *.gif 2>/dev/null`
doconvert $image -thumbnail '200x200>' thumbnails/$imageecho '<a href="'$image'">< img src="thumbnails/'$image'" alt=""/></a>' >> $output
done# End of HTML
echo '    </p></body>
</html>' >> $output复制代码

我们依顺序解释一下上面的代码:

  1. 首先,我们确认用户有没有输入表示脚本名字的参数:如果输入了参数,那么我们的脚本就被命名为用户输入的那个名字;如果没有输入参数,那么用默认的脚本名字 gallery.sh。

  2. 确保脚本文件被清空。就是那行 echo '' > $output 所做的工作。

  3. 如果要存放图片缩略图的目录(取名叫「 thumbnails 」)不存在,那么创建它。

  4. 把 HTML 文件的开头写入脚本文件。

  5. 做一个 for 循环,遍历当前目录下所有常用的图片格式的文件。对每一个被遍历到图片,用 convert 命令生成缩略图(用 -thumbnail
    参数),缩略图尺寸是 200 x 200,缩略图都存放到 thumbnails 这个子目录下。

  6. 代码中的 200x200 后面紧跟的 > 符号是为了达到「 如果原始图片的尺寸已经小于 200 x 200,那么就直接用原始图片,不需要为之生成缩略图 」的目的。参见 convert 命令的文档( man convert )。

  7. 对于每一个被 for 循环遍历到的图片,我们将其标签用 echo 写入脚本,并添加链接到原始图片的链接。

  8. 把 HTML 文件的结尾写入脚本文件。

5. 可能的优化


正如我之前所说,我们给出的解方是最基础的,你可以在此基础上做不少优化。

下面提出几点优化的设想:

  1. 对网页的样式做一定优化,需要用到 CSS 文件。
  2. 使用户能够选择包含要展示的图片的目录。对于我们上面的程序,要展示的图片必须和脚本文件在同一个目录下。
  3. 为脚本添加一个参数,用于指定缩略图尺寸。
  4. 在每张缩略图下面显示图片的名字。
  5. 在每张缩略图下面显示图片的其他信息,例如:图片原始尺寸,最近一次修改图片的时间,等等。要获取这些信息,需要调用 convert 命令。

要完成这些优化,你需要自己去查找一些手册,看一些文档,做一些测试。

但是请相信我,你会很享受这种学习的过程。如果不经历这样自我学习的过程,何来提高呢?对吧。

6. 第五部分第八课预告


今天的课就到这里,一起加油吧!

下一课我们来做一个 Shell 脚本的进阶练习:Linux探索之旅 | 第五部分第八课:用Shell做统计练习


微信公众号「程序员联盟」ProgrammerLeague
我是谢恩铭,在巴黎奋斗的软件工程师。
我的简介
我的经历
热爱生活,喜欢游泳,略懂烹饪。
人生格言:「向着标杆直跑」

Linux 探索之旅 | 第五部分第七课:Shell 实现图片展示网页相关推荐

  1. Linux 探索之旅 | 第五部分第六课:一朝 Shell 函数倾,斗转星移任我行

    -- 作者 谢恩铭 转载请注明出处 内容简介 前言 函数的作用 函数的定义 传递参数 返回值 变量作用范围 重载命令 函数的设计 总结 第五部分第七课预告 1. 前言 上一课 Linux探索之旅 | ...

  2. Linux 探索之旅 | 第五部分第八课:用 Shell 做统计练习

    -- 作者 谢恩铭 转载请注明出处 <Linux探索之旅>全系列 内容简介 前言 成果展示 解题步骤和答案 可能的优化 第五部分第九课预告 1. 前言 上一课 Linux探索之旅 | 第五 ...

  3. Linux 探索之旅 | 第五部分第五课:循环往复,Shell 开路

    -- 作者 谢恩铭 转载请注明出处 内容简介 前言 while 循环 until 循环 for 循环 总结 第五部分第六课预告 1. 前言 上一课 Linux探索之旅 | 第五部分第四课:条件一出,S ...

  4. Linux 探索之旅 | 第三部分第四课:后台运行及合并多个终端

    -- 作者 谢恩铭 转载请注明出处 内容简介 第三部分第四课:后台运行及合并多个终端 第三部分第五课预告:延时执行,唯慢不破 后台运行及合并多个终端 上一课 Linux探索之旅 | 第三部分第三课:监 ...

  5. 【Linux探索之旅】第二部分第三课:文件和文件夹,组织不会亏待你

    内容简单介绍 1.第二部分第三课:文件和文件夹,组织不会亏待你 2.第二部分第四课预告:文件操纵.鼓掌之中 文件和文件夹,组织不会亏待你 上一次课我们讲了命令行,这将成为伴随我们接下来整个Linux课 ...

  6. 【Linux探索之旅】第一部分第四课:磁盘分区,并完毕Ubuntu安装

    内容简单介绍 1.第一部分第四课:磁盘分区,并完毕Ubuntu安装 2.第一部分第五课预告:Unity桌面,人生若仅仅如初见 磁盘分区 上一课我们正式開始安装Ubuntu了.可是到了分区的那一步.小编 ...

  7. 【Linux探索之旅】第二部分第五课:用户和权限,有权就任性

    内容简单介绍 1.第二部分第五课:用户和权限,有权就任性 2.第二部分第六课预告:Nano,刚開始学习的人的文本编辑器 用户和权限.有权就任性 今天的标题也挺任性的啊,虽说小编是一个非常本分的人(真的 ...

  8. Linux 探索之旅 | 第三部分第五课:延时执行,唯慢不破

    -- 作者 谢恩铭 转载请注明出处 内容简介 第三部分第五课:延时执行,唯慢不破 第三部分第六课预告:第三部分测验题 延时执行,唯慢不破 上一课 Linux探索之旅 | 第三部分第四课:后台运行及合并 ...

  9. Linux 探索之旅 | 第四部分第二课:SSH 连接,安全快捷

    -- 作者 谢恩铭 转载请注明出处 内容简介 第四部分第二课:SSH连接,安全快捷 第四部分第三课预告:文件传输,潇洒同步 SSH连接,安全快捷 上一课是 Linux探索之旅 | 第四部分第一课:压缩 ...

  10. 【C++探索之旅】第一部分第八课:传值引用,文件源头

    内容简介 1.第一部分第八课:传值引用,文件源头 2.第一部分第九课预告:数组威武,动静合一 传值引用,文件源头 这一课的标题有点怪.其实是由这一课的几个重点内容结合起来取的名,慢慢学习就知道啦. 上 ...

最新文章

  1. 使用arthas采集火焰图
  2. python哪一版好用-Python最好用的编辑器是哪款?北京老男孩教育
  3. 30-35岁职场规划深谈,字字戳心
  4. [转]如何完美应对面试
  5. 第二增长曲线:如何发现击穿破局点的单一要素?
  6. 去年微软颁发1360万美元奖励,中国提交的漏洞报告数量位列前三强
  7. 用python画大白圣诞快乐呦
  8. 华为盒子m330能生鸿蒙吗,不仅能看片 教你怎么玩转华为M330盒子
  9. 学习总结5.0 Linux tar打包命令
  10. php仿it之家源码,织梦仿IT之家带wap手机版 v5.7
  11. android 解谜 游戏,Android解谜游戏《100个任务》图文攻略
  12. echarts关系图谱初级实现
  13. 我的世界java版地狱_我的世界怎么去地狱_Minecraft地狱门建造教程 - 我的世界中文站...
  14. 伪装学渣未删减部分_慎重勇者:破坏神和圣哉做了什么?第9话战帝被删减剧情补充...
  15. 理解virt res shr之间的关系 - linux
  16. Linux运维是什么?linux运维的基础知识
  17. win10 桌面颜色变成灰色
  18. 翻译—使用Python分析离散心率信号–第2部分
  19. 谈谈java中封装的那点事
  20. Android RTL布局适配

热门文章

  1. Asp.Net 之 枚举类型的下拉列表绑定
  2. PB与各种数据库连接
  3. 从办公桌可以看透一个人
  4. Vegas如何设置淡入淡出?
  5. Centos 7 配置 apache 网站
  6. log4j容器初始化探究
  7. 【POJ 2342】Anniversary party(入门树形dp)
  8. Visual Studio 2015 移动跨平台开发初体验
  9. [实变函数]2.2 聚点 (cluster point), 内点 (interior point), 界点 (boundary point)
  10. 无所不能的『十五郎』向您致敬!!!