-- 作者 謝恩銘 轉載請註明出處
《Linux探索之旅》全系列
內容簡介
- 前言
- 成果展示
- 生成縮圖
- 我的答案
- 可能的優化
- 第五部分第八課預告
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 檔案就是一個網頁檔案,用來展示這些圖片。
因此,這個指令碼需要依次做以下的事:
根據目錄中的每張圖片,生成對應縮圖。
生成一個 HTML 檔案,把縮圖都插入其中。
給每張縮圖繫結一個連結,會連結到原始圖片。
為了寫出這個指令碼,需要有一些前端的網路知識,比如 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 推出的官方教程:
4. 我的答案
我給出我的解法,你的程式碼當然不必和我一樣,但我想基本原理是一樣的。
#!/bin/bash
# Verification of parameter
# If no parameter, use a default value
if [ -z $1 ]
then
output='gallery.html'
else
output=$1
fi
# Preparation of files and folders
echo '' > $output
if [ ! -e thumbnails ]
then
mkdir 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`
do
convert $image -thumbnail '200x200>' thumbnails/$image
echo '<a href="'$image'">< img src="thumbnails/'$image'" alt=""/></a>' >> $output
done
# End of HTML
echo ' </p>
</body>
</html>' >> $output複製程式碼
我們依順序解釋一下上面的程式碼:
首先,我們確認使用者有沒有輸入表示指令碼名字的引數:如果輸入了引數,那麼我們的指令碼就被命名為使用者輸入的那個名字;如果沒有輸入引數,那麼用預設的指令碼名字 gallery.sh。
確保指令碼檔案被清空。就是那行
echo '' > $output
所做的工作。如果要存放圖片縮圖的目錄(取名叫「 thumbnails 」)不存在,那麼建立它。
把 HTML 檔案的開頭寫入指令碼檔案。
做一個 for 迴圈,遍歷當前目錄下所有常用的圖片格式的檔案。對每一個被遍歷到圖片,用 convert 命令生成縮圖(用
-thumbnail
引數),縮圖尺寸是 200 x 200,縮圖都存放到 thumbnails 這個子目錄下。程式碼中的 200x200 後面緊跟的
>
符號是為了達到「 如果原始圖片的尺寸已經小於 200 x 200,那麼就直接用原始圖片,不需要為之生成縮圖 」的目的。參見 convert 命令的文件(man convert
)。對於每一個被 for 迴圈遍歷到的圖片,我們將其標籤用 echo 寫入指令碼,並新增連結到原始圖片的連結。
把 HTML 檔案的結尾寫入指令碼檔案。
5. 可能的優化
正如我之前所說,我們給出的解方是最基礎的,你可以在此基礎上做不少優化。
下面提出幾點優化的設想:
- 對網頁的樣式做一定優化,需要用到 CSS 檔案。
- 使使用者能夠選擇包含要展示的圖片的目錄。對於我們上面的程式,要展示的圖片必須和指令碼檔案在同一個目錄下。
- 為指令碼新增一個引數,用於指定縮圖尺寸。
- 在每張縮圖下面顯示圖片的名字。
- 在每張縮圖下面顯示圖片的其他資訊,例如:圖片原始尺寸,最近一次修改圖片的時間,等等。要獲取這些資訊,需要呼叫 convert 命令。
要完成這些優化,你需要自己去查詢一些手冊,看一些文件,做一些測試。
但是請相信我,你會很享受這種學習的過程。如果不經歷這樣自我學習的過程,何來提高呢?對吧。
6. 第五部分第八課預告
今天的課就到這裡,一起加油吧!
下一課我們來做一個 Shell 指令碼的進階練習:Linux探索之旅 | 第五部分第八課:用Shell做統計練習
微信公眾號「程式設計師聯盟」ProgrammerLeague
我是謝恩銘,在巴黎奮鬥的軟體工程師。
我的簡介
我的經歷
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:「向著標杆直跑」