Linux中國

如何入門 Bash 編程

Unix 最初的希望之一是,讓計算機的日常用戶能夠微調其計算機,以適應其獨特的工作風格。幾十年來,人們對計算機定製的期望已經降低,許多用戶認為他們的應用程序和網站的集合就是他們的 「定製環境」。原因之一是許多操作系統的組件未不開源,普通用戶無法使用其源代碼。

但是對於 Linux 用戶而言,定製程序是可以實現的,因為整個系統都圍繞著可通過終端使用的命令啦進行的。終端不僅是用於快速命令或深入排除故障的界面;也是一個腳本環境,可以通過為你處理日常任務來減少你的工作量。

如何學習編程

如果你以前從未進行過任何編程,可能面臨考慮兩個不同的挑戰:一個是了解怎樣編寫代碼,另一個是了解要編寫什麼代碼。你可以學習 語法,但是如果你不知道 語言 中有哪些可用的關鍵字,你將無法繼續。在實踐中,要同時開始學習這兩個概念,是因為如果沒有關鍵字的堆砌就無法學習語法,因此,最初你要使用基本命令和基本編程結構來編寫簡單的任務。一旦熟悉了基礎知識,就可以探索更多編程語言的內容,從而使你的程序能夠做越來越重要的事情。

Bash 中,你使用的大多數 關鍵字 是 Linux 命令。 語法 就是 Bash。如果你已經頻繁地使用過了 Bash,則向 Bash 編程的過渡相對容易。但是,如果你不曾使用過 Bash,你會很高興地了解到它是一種為清晰和簡單而構建的簡單語言。

交互設計

有時,學習編程時最難搞清楚的事情就是計算機可以為你做些什麼。顯然,如果一台計算機可以自己完成你要做的所有操作,那麼你就不必再碰計算機了。但是現實是,人類很重要。找到你的計算機可以幫助你的事情的關鍵是注意到你一周內需要重複執行的任務。計算機特別擅長於重複的任務。

但是,為了能告知計算機為你做某事,你必須知道怎麼做。這就是 Bash 擅長的領域:互動式編程。在終端中執行一個動作時,你也在學習如何編寫腳本

例如,我曾經負責將大量 PDF 書籍轉換為低墨和友好列印的版本。一種方法是在 PDF 編輯器中打開 PDF,從數百張圖像(頁面背景和紋理都算作圖像)中選擇每張圖像,刪除它們,然後將其保存到新的 PDF中。僅僅是一本書,這樣就需要半天時間。

我的第一個想法是學習如何編寫 PDF 編輯器腳本,但是經過數天的研究,我找不到可以編寫編輯 PDF 應用程序的腳本(除了非常醜陋的滑鼠自動化技巧)。因此,我將注意力轉向了從終端內找出完成任務的方法。這讓我有了幾個新發現,包括 GhostScript,它是 PostScript 的開源版本(PDF 基於的印表機語言)。通過使用 GhostScript 處理了幾天的任務,我確認這是解決我的問題的方法。

編寫基本的腳本來運行命令,只不過是複製我用來從 PDF 中刪除圖像的命令和選項,並將其粘貼到文本文件中而已。將這個文件作為腳本運行,大概也會產生同樣的結果。

向 Bash 腳本傳參數

在終端中運行命令與在 Shell 腳本中運行命令之間的區別在於前者是互動式的。在終端中,你可以隨時進行調整。例如,如果我剛剛處理 example_1.pdf 並準備處理下一個文檔,以適應我的命令,則只需要更改文件名即可。

Shell 腳本不是互動式的。實際上,Shell 腳本 存在的唯一原因是讓你不必親自參與。這就是為什麼命令(以及運行它們的 Shell 腳本)會接受參數的原因。

在 Shell 腳本中,有一些預定義的可以反映腳本啟動方式的變數。初始變數是 $0,它代表了啟動腳本的命令。下一個變數是 $1 ,它表示傳遞給 Shell 腳本的第一個 「參數」。例如,在命令 echo hello 中,命令 echo$0,,關鍵字 hello$1,而 world$2

在 Shell 中交互如下所示:

$ echo hello world
hello world

在非互動式 Shell 腳本中,你 可以 以非常直觀的方式執行相同的操作。將此文本輸入文本文件並將其另存為 hello.sh

echo hello world

執行這個腳本:

$ bash hello.sh
hello world

同樣可以,但是並沒有利用腳本可以接受輸入這一優勢。將 hello.sh 更改為:

echo $1

用引號將兩個參數組合在一起來運行腳本:

$ bash hello.sh "hello bash"
hello bash

對於我的 PDF 瘦身項目,我真的需要這種非交互性,因為每個 PDF 都花了幾分鐘來壓縮。但是通過創建一個接受我的輸入的腳本,我可以一次將幾個 PDF 文件全部提交給腳本。該腳本按順序處理了每個文件,這可能需要半小時或稍長一點時間,但是我可以用半小時來完成其他任務。

流程式控制制

創建 Bash 腳本是完全可以接受的,從本質上講,這些腳本是你開始實現需要重複執行任務的準確過程的副本。但是,可以通過控制信息流的方式來使腳本更強大。管理腳本對數據響應的常用方法是:

  • if/then 選擇結構語句
  • for 循環結構語句
  • while 循環結構語句
  • case 語句

計算機不是智能的,但是它們擅長比較和分析數據。如果你在腳本中構建一些數據分析,則腳本會變得更加智能。例如,基本的 hello.sh 腳本運行後不管有沒有內容都會顯示:

$ bash hello.sh foo
foo
$ bash hello.sh

$

如果在沒有接收輸入的情況下提供幫助消息,將會更加容易使用。如下是一個 if/then 語句,如果你以一種基本的方式使用 Bash,則你可能不知道 Bash 中存在這樣的語句。但是編程的一部分是學習語言,通過一些研究,你將了解 if/then 語句:

if [ "$1" = "" ]; then
        echo "syntax: $0 WORD"
        echo "If you provide more than one word, enclose them in quotes."
else
        echo "$1"
fi

運行新版本的 hello.sh 輸出如下:

$ bash hello.sh
syntax: hello.sh WORD
If you provide more than one word, enclose them in quotes.
$ bash hello.sh "hello world"
hello world

利用腳本工作

無論你是從 PDF 文件中查找要刪除的圖像,還是要管理混亂的下載文件夾,抑或要創建和提供 Kubernetes 鏡像,學習編寫 Bash 腳本都需要先使用 Bash,然後學習如何將這些腳本從僅僅是一個命令列表變成響應輸入的東西。通常這是一個發現的過程:你一定會找到新的 Linux 命令來執行你從未想像過可以通過文本命令執行的任務,你會發現 Bash 的新功能,使你的腳本可以適應所有你希望它們運行的不同方式。

學習這些技巧的一種方法是閱讀其他人的腳本。了解人們如何在其系統上自動化死板的命令。看看你熟悉的,並尋找那些陌生事物的更多信息。

另一種方法是下載我們的 Bash 編程入門 電子書。它向你介紹了特定於 Bash 的編程概念,並且通過學習的構造,你可以開始構建自己的命令。當然,它是免費的,並根據 創作共用許可證 進行下載和分發授權,所以今天就來獲取它吧。

via: https://opensource.com/article/20/4/bash-programming-guide

作者:Seth Kenlon 選題:lujun9972 譯者:stevenzdg988 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國