Bash 指令碼是系統管理和自動化任務的利器,本文將探討其實際應用,並以影像處理和日期計算為例,解析指令碼的編寫技巧與應用場景。文章涵蓋了指令碼的基礎知識、引數處理、命令運用等方面,並提供簡潔易懂的程式碼範例,讓讀者能夠快速掌握 Bash 指令碼的核心技術,並應用於日常工作中,提升效率。

深入理解與實踐:Bash 指令碼實戰詳解

本篇文章旨在探討Bash指令碼的實際應用,並透過具體例項進行詳細解析。文中將重點介紹多個實用的Bash指令碼範例,包括影像處理、日期計算等,並對其程式碼進行深入分析。

影像處理指令碼實戰

影像大小分析指令碼

在影像處理領域,分析影像大小是一項基本任務。以下是一個智慧型影像大小分析指令碼的範例:

#!/bin/bash

# 檢查是否提供檔案路徑
if [ "$#" -ne 1 ]; then
    echo "用法:$0 <影像檔案路徑>"
    exit 1
fi

# 取得影像大小
identify -format "%wx%h" "$1"

內容解密:

此指令碼首先檢查是否提供了正確的檔案路徑引數。identify 命令來自 ImageMagick 套件,用於取得影像的尺寸資訊。-format "%wx%h" 引數指定輸出格式為寬度乘以高度。

影像浮水印新增指令碼

為影像新增浮水印是保護版權的一種常見做法。以下是一個簡單的浮水印新增指令碼:

#!/bin/bash

# 檢查引數
if [ "$#" -ne 3 ]; then
    echo "用法:$0 <輸入影像> <浮水印文字> <輸出影像>"
    exit 1
fi

# 新增浮水印
convert "$1" -gravity SouthEast -pointsize 36 -draw "fill black text 0,0 '$2'" "$3"

內容解密:

此指令碼使用 convert 命令來新增浮水印。-gravity SouthEast 將浮水印放置在右下角,-pointsize 36 設定文字大小,-draw 引數用於繪製文字。

日期計算指令碼實戰

計算兩個日期之間的天數

計算兩個日期之間的天數是一項常見的需求。以下是一個實作此功能的指令碼:

#!/bin/bash

# 檢查引數
if [ "$#" -ne 2 ]; then
    echo "用法:$0 <日期1> <日期2>"
    exit 1
fi

# 計算天數差異
echo $(( ($(date -d "$2" +%s) - $(date -d "$1" +%s)) / 86400 ))

內容解密:

此指令碼使用 date 命令將日期轉換為 Unix 時間戳(自1970年1月1日以來的秒數),然後計算兩個時間戳之間的差異,最後將秒數轉換為天數。

前言與致謝

我還要感謝我的孩子——Ashley、Gareth和Kiana,以及我們的寵物們的支援。

第二版致謝

《Wicked Cool Shell Scripts》在過去的十年中被證明是一本對任何喜歡bash指令碼或想要學習更進階技術的人來說非常有用且鼓舞人心的讀物。在更新第二版的過程中,我們希望為這本文注入新的活力,並激發另一個十年的shell指令碼探索。這項工作需要許多人的支援。

我要感謝我的貓Sam,他在我工作的時候坐在我的筆記型電腦上,雖然我確信他是出於好意,認為自己在幫忙。我的家人和朋友對我幾個月來只談論bash指令碼表示完全支援和理解。No Starch Press團隊對一個從未寫過除高中論文或部落格文章以外的人提供了難以置信的支援,特別感謝Bill Pollock、Liz Chadwick、Laurel Chun和整個No Starch團隊。Jordi Gutiérrez Hermoso在技術方面的投入非常寶貴且值得感激。

介紹

自2004年本文第一版出版以來,Unix系統管理的世界發生了巨大的變化。當時,很少有普通的電腦使用者執行類別Unix作業系統,但隨著Ubuntu等初學者友好的桌面Linux發行版的流行,這種情況開始改變。隨後出現了OS X,這是蘋果公司根據Unix的作業系統的下一次迭代,以及一系列根據iOS的技術。如今,如果我們考慮到Android智慧手機,類別Unix作業系統可能是世界上最普遍的作業系統。

無庸置疑,很多事情都發生了變化,但有一件事仍然保持不變,那就是Bourne-again shell(bash)作為Unix使用者可用的主流系統shell。利用bash指令碼的全部功能,從來都不是系統管理員、工程師或愛好者工具箱中更需要的技能。

本文重點

本文著重於撰寫可移植自動化時可能面臨的共同挑戰,例如在構建軟體或提供協調時,透過使常見任務易於自動化來解決問題。但是,要充分利用這本文,需要將為每個問題創造的解決方案外推到您可能遇到的其他類別似問題。例如,在第1章中,我們透過建立一個小的包裝指令碼來編寫一個可移植的echo實作。雖然許多系統管理員將從這個特定的指令碼中受益,但重要的收穫是建立包裝指令碼以確保跨平台的一致行為的一般解決方案。在本文的後面,我們將探討bash指令碼的一些很酷的功能以及Unix系統可用的通用工具,將巨大的多樣性和強大的功能置於您的指尖。

本文適用物件

對於任何在類別Unix伺服器或工作站上工作的人來說,Bash仍然是一個基本工具,包括網頁開發人員(其中許多人在OS X上開發並佈署到Linux伺服器)、資料分析師、行動應用程式開發人員和軟體工程師等。此外,更多的愛好者正在他們的開源微型電腦(如Raspberry Pi)上執行Linux,以自動化他們的智慧家居。對於所有這些用途,shell指令碼都是完美的。

這些指令碼的應用對於那些希望透過一些很酷的shell指令碼來發展他們已經相當不錯的bash技能的人,以及那些可能只是偶爾使用終端或shell指令碼的人來說,都是無窮無盡的有用。後者可能希望複習一些捷徑,或透過介紹更進階的bash概念來補充他們的閱讀。

本文結構

第二版更新並現代化了原來的12章,並新增了3個新的章節。每個章節將展示shell指令碼的新功能或使用案例,它們共同涵蓋了shell指令碼的多種應用方式。

Unix Shell 指令碼應用介紹

Unix Shell 指令碼是一種強大的工具,能夠簡化使用者的操作流程並提升工作效率。對於 OS X 使用者來說,本文中的大多數指令碼同樣適用於 Linux 或 OS X 系統,書中會明確指出那些需要特別注意的例外情況。

全書章節概覽

第 0 章:Shell 指令碼快速入門

本章專為新版而新增,為 Unix 新手提供快速入門,介紹 bash 指令碼的基本語法和如何使用它們。從 Shell 指令碼的基本概念到建立和執行簡單的 Shell 指令碼,本章將幫助讀者快速掌握 bash 指令碼的基礎知識,以便順利進入第 1 章的學習。

第 1 章:遺失的程式函式庫

在 Unix 環境中,像 C、Perl 和 Python 等程式語言都擁有豐富的函式庫和實用工具,用於驗證數字格式、計算日期偏移等各種任務。然而,在使用 Shell 時,使用者需要自行開發相關工具。本章將重點介紹如何讓 Shell 指令碼更為實用,涵蓋了多種輸入驗證功能、一個簡單而強大的 bc 前端工具,以及如何使用 ANSI 色彩序列等實用技巧。

第 2 章和第 3 章:改善使用者命令和建立實用工具

這兩章提供了許多能夠擴充套件和增強 Unix 功能的新命令。Unix 的一大特點是它能夠不斷進化和發展。本文提供了許多實用的指令碼,如互動式計算器、事件提醒系統、重新實作的 locate 命令、多時區日期命令,以及改進版的 ls 命令,以提高目錄列表的實用性。

第 4 章:改進 Unix

有些 Unix 的設計看似存在缺陷,即使經過數十年的發展。本章旨在解決不同 Unix 版本之間的差異,包括命令選項、命令一致性等問題。書中提供了一些重寫或前端命令,以使它們更友好或更具一致性。此外,還介紹瞭如何為非 GNU 命令新增 GNU 風格的全字命令選項,以及簡化檔案壓縮工具的使用。

第 5 章和第 6 章:系統管理 - 使用者管理和系統維護

本文的讀者很可能擁有一個或多個 Unix 系統的管理許可權。這兩章提供了許多指令碼來簡化管理工作,包括磁碟使用分析工具、自動傳送電子郵件通知超出配額使用者的磁碟配額系統、crontab 驗證工具、日誌檔案輪替工具,以及備份工具等。

第 7 章:網際網路使用者

本章展示瞭如何利用 Unix 命令列簡便地處理網際網路資源。書中提供了提取網頁 URL 的工具、天氣追蹤器、電影資料函式庫搜尋工具,以及網站變更追蹤器,當網站發生變更時自動傳送電子郵件通知。

第 8 章:網站管理員技巧

針對網站管理員,本章提供了建立動態網頁、建立網頁相簿,以及記錄網頁搜尋等實用工具。

第 9 章和第 10 章:網際網路管理和伺服器管理

這兩章探討了管理對外伺服器所面臨的挑戰。書中提供了分析網頁伺服器流量日誌的指令碼、識別網站內部或外部損壞連結的工具,以及一個方便的 Apache 網頁密碼管理工具,用於維護 .htaccess 檔案的準確性。此外,還介紹了映象目錄和整個網站的技術。

第 11 章:OS X 指令碼

OS X 將 Unix 系統與商業上成功的圖形使用者介面相結合,為編寫有用的指令碼提供了豐富的機會。本章探索了專門為 OS X 編寫的指令碼,包括自動化螢幕保護程式設定等範例。

本文特色

  • 詳細介紹 Unix Shell 指令碼的基本語法和應用方法。
  • 提供多個實用的 Shell 指令碼範例,涵蓋系統管理、網際網路應用等多個領域。
  • 重點介紹如何解決不同 Unix 版本之間的差異和相容性問題。
內容解密:
  1. 本文介紹了 Unix Shell 指令碼的基本概念和應用,強調其在簡化操作流程和提升工作效率方面的重要性。
  2. 各章節涵蓋了 Shell 指令碼入門、實用工具開發、系統管理、網際網路應用等多個主題,為讀者提供了全面的學習內容。
  3. 透過豐富的範例和詳細的解說,本文幫助讀者掌握 Unix Shell 指令碼的核心技術,並解決實際工作中的問題。

零章:Shell 指令碼速成課程

Bash(以及一般的 Shell 指令碼)已經存在很長一段時間,每天都有新人被介紹到 Shell 指令碼和系統自動化的強大功能。隨著微軟在 Windows 10 中發布了互動式 Bash Shell 和 Unix 子系統,從未有過更好的時機來學習 Shell 指令碼的簡單和有效性。

到底什麼是 Shell 指令碼?

從電腦的早期開始,Shell 指令碼就一直幫助系統管理員和程式設計師執行繁瑣的工作,否則就需要花費時間和精力。那麼,什麼是 Shell 指令碼,為什麼你應該關心?Shell 指令碼是文字檔案,包含一系列命令,按照指令碼中編寫的順序,為特定的 Shell(在我們的例子中是 Bash)執行。Shell 是您與作業系統上可用的命令函式庫之間的命令列介面。

內容解密:

Shell 指令碼本質上是使用 Shell 環境中可用的命令建立的小型程式,用於自動化特定的任務——通常是那些沒人願意手動執行的任務,例如網頁抓取、磁碟使用情況追蹤、下載天氣資料、重新命名檔案等等。你甚至可以使用 Shell 指令碼製作基本的遊戲!這些指令碼可以包含簡單的邏輯,就像你在其他語言中看到的 if 陳述句一樣,但它們也可以更簡單,就像你很快就會看到的那樣。

許多型別的命令列 Shell,例如 tcsh、zsh 和流行的 Bash,都可用於 OS X、BSD 和 Linux 作業系統。本文將重點介紹 Unix 環境的主流——Bash。每個 Shell 都有其自己的功能和特性,但大多數人在 Unix 上首先熟悉的 Shell 通常是 Bash。在 OS X 上,終端應用程式將開啟一個具有 Bash Shell 的視窗(參見圖 0-1)。在 Linux 上,命令 Shell 程式可以有很大的不同,但常見的命令列控制檯是 GNOME 的 gnome-terminal 或 KDE 的 konsole。這些應用程式可以更改其組態,以便使用不同型別的命令列 Shell,但它們都預設使用 Bash。基本上,如果你正在使用任何型別的類別 Unix 作業系統,開啟終端應用程式應該預設為 Bash Shell。

小段落標題:圖 0-1 OS X上的終端應用程式,顯示一個版本的 Bash

注意: 2016 年 8 月,微軟發布了適用於 Windows 10 Anniversary 版本的 Bash,因此如果你在 Windows 上工作,你仍然可以執行 Bash Shell。附錄 A 給出了在 Windows 10 上安裝 Bash 的說明,但本文假設你正在執行類別似 Unix 的作業系統,如 OS X 或 Linux。請隨意在 Windows 10 上測試這些指令碼,但我們不做任何保證,也沒有在 Windows 上測試過它們!然而,Bash 的美妙之處在於可移植性,本文中的許多指令碼應該“正常工作”。