我是如何開始踏上 bash 指令碼程式設計之路的?

Sandra Mccann發表於2017-06-18

透過一些簡單的 Google 搜尋,即使是程式設計入門者也可以嘗試編寫程式碼將以往枯燥和冗長的任務自動化。

How Google helped me learn bash scripting

我前幾天寫了一個指令碼。對於一些人來說,這句話聽起來沒什麼了不起的。而對於另一些人來說,這句話意義重大。要知道,我不是一個程式設計師,而是一個作家。

我需要解決什麼?

我的問題相當簡單:我需要將工程檔案進行分類。這些檔案可以從一個網站 URL 以 .zip 的格式下載。當我正手工將它們複製到我的電腦桌面,並移動到一個已按照我檔案分類的需要進行了結構化的目錄時,一位作家同事給我提了建議:“不就是寫個指令碼的事嗎?”

我心想:“就寫個指令碼?”——說得好像這是世界上最容易做的事情一樣。

Google 是如何解救我的?

同事的問題促使我思考,並且經過思考後,我進行了 Google 搜尋。

Linux 上使用的是什麼指令碼程式語言?

這是我第一個 Google 搜尋的準則。也許很多人心裡會想:“她太笨了!”是的,我很笨。不過,這的確使我走上了一條解決問題的道路。最常見的搜尋結果是 Bash 。嗯,我聽說過 Bash 。呃,我要分類的檔案中有一個裡面就有 Bash,那無處不在的 #!/bin/bash 。我重新看了下那個檔案,我知道它的用途,因為我需要將它分類。

這引導我進行了下一個 Google 搜尋。

如何從一個 URL 下載 zip 檔案?

那確實是我的基本任務。我有一個帶有 .zip 檔案的 URL ,它包含有所有我需要分類的檔案,所以我尋求萬能的 Google 的幫助。搜尋到的精華內容和其它一些結果引導我使用 Curl 。但最重要的是:我不僅找到了 Curl ,其中一條置頂的搜尋結果還展示了一個使用 Curl 去下載並解壓 .zip 檔案的 Bash 指令碼。這超出了我本來想尋求的答案,但那也使我意識到在 Google 搜尋具體的請求可以得到我寫這個指令碼需要的資訊。所以,在這個收穫的推動下,我寫了最簡單的指令碼:

#!/bin/sh

curl http://rather.long.url | tar -xz -C my_directory --strip-components=1

我迫不及待地執行看看。但我發現一個問題: URL 是會變的,根據我要訪問的檔案的分組不同而不同。我有新的問題需要解決,這使我進行了下一輪搜尋。

引數如何傳遞給 Bash 指令碼?

我需要以不同的 URL 和不同的最終目錄來執行此指令碼。 Google 向我展示瞭如何使用 $1$2 等等來替換我在命令列中執行指令碼時輸入的內容。比如:

bash myscript.sh http://rather.long.url my_directory

這就好多了。一切如我所願,靈活,實用。最重要的是我只要輸入一條簡短的命令就可以節省 30 分鐘無聊的複製、貼上工作。這個早上的時間花得值得。

然後我發現還有一個問題:我很健忘,並且我知道我幾個月才執行一次這個指令碼。這留給我兩個疑問:

  • 我要如何記得執行指令碼時輸入什麼(URL 先,還是目錄先)?
  • 如果我被貨車撞了,其它作家如何知道該怎樣執行我的指令碼?

我需要一個使用說明 —— 如果我使用不正確,則指令碼會提示。比如:

usage: bash yaml-fetch.sh <'snapshot_url'> <directory>

否則,則直接執行指令碼。我的下一個搜尋是:

如何在 Bash 指令碼里使用 “if/then/else”?

幸運的是,我已經知道程式設計中 if/then/else 的存在。我只要找出如何使用它的方法。在這個過程中,我也學到了如何在 Bash 指令碼里使用 echo 列印。我的最終成果如下:

#!/bin/sh

URL=$1
DIRECTORY=$2

if [ $# -eq 0 ];
 then
 echo "usage: bash yaml-fetch.sh <'snapshot_url'> <directory>".
 else

# 如果目錄不存在則建立它
 echo 'create directory'

 mkdir $DIRECTORY

 # 下載並解壓 yaml 檔案
 echo 'fetch and untar the yaml files'

 curl $URL | tar -xz -C $DIRECTORY --strip-components=1
fi

Google 和指令碼程式設計如何顛覆我的世界?

好吧,這稍微有點誇大,不過現在是 21 世紀,學習新東西(特別是稍微簡單的東西)比以前簡單多了。我所學到的(除了如何寫一個簡短的、自動分類的 Bash 指令碼之外)是如果我有疑問,那麼有很大可能性是其它人在之前也有過相同的疑問。當我困惑時,我可以問下一個問題,再下一個問題。最後,我不僅擁有了指令碼,還擁有了可以一直擁有並可以簡化其它任務的新技能,這是我之前所沒有的。

別止步於第一個指令碼(或者程式設計的第一步)。這是一個技能,和其它的技能並無不同,有大量的資訊可以在這一路上幫助你。你無需閱讀大量的書或參加一個月的課程。你可以像嬰兒學步那樣簡單地開始寫指令碼,然後掌握技能並建立自信。人們總有寫成千上萬行程式碼的需求,並對它進行分支、合併、修復錯誤。但是,透過簡單的指令碼或其它方式來自動化、簡單化任務的需求也一樣強烈。這樣的一個小指令碼和小小的自信就能夠讓你啟程指令碼程式設計之路。

(題圖: opensource.com)


作者簡介:

Sandra McCann 是一位 Linux 和開源技術的倡導者。她是一位軟體開發者、學習資源內容架構師、內容創作者。桑德拉目前是位於韋斯特福德馬薩諸塞州的紅帽公司的內容創作者,專注於 OpenStack 和 NFV 技術。


via: https://opensource.com/article/17/5/how-i-learned-bash-scripting

作者:Sandra McCann 譯者:xllc 校對:wxy

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

相關文章