shell指令碼初學者指南:基礎知識

“shell指令碼”一詞在Linux論壇中經常被提及,但許多使用者並不熟悉。學習這種簡單而強大的程式設計方法可以幫助您節省時間,更好地學習命令列,並消除繁瑣的檔案管理任務。...

shell指令碼初學者指南:基礎知識

“shell指令碼”一詞在Linux論壇中經常被提及,但許多使用者並不熟悉。學習這種簡單而強大的程式設計方法可以幫助您節省時間,更好地學習命令列,並消除繁瑣的檔案管理任務。

什麼是shell指令碼(shell scripting)?

作為一個Linux使用者,意味著你要玩弄命令列。不管你喜不喜歡,透過這個介面做一些事情要比點選和點選容易得多。使用和學習命令列越多,就越能看到它的潛力。嗯,命令列本身就是一個程式:shell。今天大多數Linux發行版都使用Bash,而這正是您真正要輸入命令的地方。

現在,在使用Linux之前使用Windows的一些人可能還記得批處理檔案。這些是小的文字檔案,你可以填充命令來執行,Windows會依次執行它們。這是一個聰明和整潔的方式來完成一些事情,比如在你的高中計算機實驗室運行遊戲時,你不能開啟系統資料夾或建立快捷方式。Windows中的批處理檔案雖然有用,但卻是shell指令碼的廉價仿製品。

shell指令碼初學者指南:基礎知識

Shell指令碼允許我們在鏈中編寫命令,並讓系統將它們作為指令碼事件執行,就像批處理檔案一樣。它們還允許使用更有用的功能,例如命令替換。您可以呼叫一個命令,比如date,並將其輸出用作檔案命名方案的一部分。您可以自動執行備份,並且每個複製的檔案都可以在其名稱末尾附加當前日期。指令碼也不僅僅是命令的呼叫。它們本身就是程式。指令碼允許您直接在作業系統的介面中使用程式設計功能,例如“for”迴圈、if/then/else語句等。而且,您不必學習另一種語言,因為您使用的是您已經知道的:命令列。

我想這就是指令碼的力量。你可以用你已經知道的命令來程式設計,同時學習大多數主要的程式語言。需要做一些重複和乏味的事情嗎?編寫指令碼!需要一個真正複雜的命令的快捷方式嗎?編寫指令碼!想為某些東西構建一個真正易於使用的命令列介面嗎?編寫指令碼!

開始之前

在開始編寫腳本系列之前,讓我們先介紹一些基本資訊。我們將使用bashshell,這是大多數Linux發行版本機使用的。Mac OS使用者和Windows上的Cygwin也可以使用Bash。因為它是如此的普遍,你應該能夠指令碼無論你的平臺。此外,只要引用的所有命令都存在,指令碼就可以在多個平臺上工作,幾乎不需要調整。

指令碼可以很容易地使用“管理員”或“超級使用者”許可權,因此最好在指令碼開始工作之前測試它們。還要使用常識,比如確保要對其執行指令碼的檔案有備份。使用正確的選項也非常重要,比如-i代表rm命令,這樣就需要您的互動。這可以防止一些嚴重的錯誤。因此,通讀你下載的指令碼,小心處理你的資料,以防出錯。

指令碼的核心只是純文字檔案。您可以使用任何文字編輯器來編寫它們:gedit、emacs、vim、nano……這個列表還在繼續。只需確保將其儲存為純文字,而不是富文字或Word文件。因為我喜歡nano提供的易用性,所以我會使用它。

指令碼許可權和名稱

指令碼像程式一樣執行,為了實現這一點,它們需要有適當的許可權。透過在指令碼上執行以下命令,可以使指令碼可執行:

chmod +x ~/somecrazyfolder/script1

這將允許任何人執行該特定指令碼。如果您想將其僅限於您的使用者使用,可以改用此選項:

chmod u+x ~/somecrazyfolder/script1

要執行此指令碼,必須將cd放入正確的目錄,然後按以下方式執行指令碼:

cd ~/somecrazyfolder

./script1

為了方便起見,您可以將指令碼放在主目錄的“bin”資料夾中:

~/bin

在許多現代發行版中,預設情況下不再建立此資料夾,但您可以建立它。這通常是儲存屬於您的使用者而不是其他使用者的可執行檔案的地方。透過將指令碼放在這裡,您只需鍵入它們的名稱就可以執行它們,就像其他命令一樣,而不必在cd上到處播放並使用“./”字首。

不過,在命名指令碼之前,應使用以下命令檢查是否安裝了使用該名稱的程式:

which [command]

很多人將他們早期的指令碼命名為“test”,當他們試圖在命令列中執行它時,什麼也沒有發生。這是因為它與test命令衝突,test命令在沒有引數的情況下不執行任何操作。始終確保您的指令碼名稱與命令不衝突,否則您可能會發現自己在做不打算做的事情!

指令碼編寫準則

shell指令碼初學者指南:基礎知識

如前所述,每個指令碼檔案本質上都是純文字。但這並不意味著你可以隨心所欲地寫下你想要的東西。當試圖執行一個文字檔案時,shell將透過它們來分析它們是否是指令碼,以及如何正確處理一切。因此,您需要了解一些準則。

  1. 每個指令碼都應該有“#”!/“箱/bash”
  2. 每一行都是一條新命令
  3. 註釋行以#
  4. 命令被()

雜湊爆炸駭客

當shell透過文字檔案進行解析時,將檔案標識為指令碼的最直接方法是將第一行:

#!/bin/bash

如果您使用另一個shell,請在此處替換它的路徑。註釋行以雜湊(#)開頭,但添加了bang(!)之後的shell路徑是一種駭客行為,它將繞過此註釋規則,並強制指令碼使用此行所指向的shell執行。

新行=新命令

每一個新行都應該被視為一個新命令,或者一個更大系統的元件。例如,If/then/else語句將接管多行,但該系統的每個元件都位於新行中。不要讓命令溢位到下一行,因為這可能會截斷上一個命令,並在下一行給您一個錯誤。如果您的文字編輯器正在這樣做,為了安全起見,您應該關閉文字包裝。您可以按ALT+L關閉nano位中的文字換行。

經常用#s評論

如果以#開始一行,則忽略該行。這將把它變成一個註釋行,在這裡您可以提醒自己上一個命令的輸出是什麼,或者下一個命令將做什麼。同樣,關閉文字包裝,或者將註釋分成多行,所有行都以雜湊開頭。使用大量的註釋是一個很好的實踐,因為它可以讓你和其他人更容易地調整你的指令碼。唯一的例外是前面提到的Hash Bang hack,所以不要跟著它!s、 ;—)

命令用括號括起來

以前,命令替換是用單個記號(`,共享~鍵)完成的。我們還不打算討論這個問題,但是隨著大多數人在學習了基礎知識之後開始探索,最好還是用括號代替。這主要是因為在巢狀時(將命令放在其他命令中),括號效果更好。

你的第一個劇本

讓我們從一個簡單的指令碼開始,該指令碼允許您複製檔案並在檔名末尾附加日期。我們叫它“datecp”。首先,讓我們檢查一下該名稱是否與以下內容衝突:

shell指令碼初學者指南:基礎知識

您可以看到which命令並沒有輸出,所以我們都設定為使用這個名稱。

讓我們在~/bin資料夾中建立一個空白檔案:

touch ~/bin/datecp

shell指令碼初學者指南:基礎知識

在我們忘記之前,讓我們現在更改許可權:

shell指令碼初學者指南:基礎知識

那我們就開始寫劇本吧。在您選擇的文字編輯器中開啟該檔案。就像我說的,我喜歡nano的簡單性。

nano ~/bin/datecp

接下來,我們將先決條件放在第一行,並對這個指令碼的功能進行註釋。

shell指令碼初學者指南:基礎知識

接下來,讓我們宣告一個變數。如果你學過代數,你可能知道那是什麼。變數允許我們儲存資訊並使用它進行操作。當在別處引用時,變數可以“擴充套件”。也就是說,它們將顯示儲存的內容,而不是顯示它們的名稱。以後可以告訴同一個變數儲存不同的資訊,之後發生的任何指令都將使用新資訊。這是一個非常花哨的佔位符。

我們將輸入輸出什麼變數?好吧,我們來儲存日期和時間吧!為此,我們將呼叫date命令。

請看下面的螢幕截圖,瞭解如何構建date命令的輸出:

shell指令碼初學者指南:基礎知識

可以看到,透過新增以%開頭的不同變數,可以將命令的輸出更改為所需的輸出。有關詳細資訊,可以檢視date命令的手冊頁。

讓我們使用date命令的最後一次迭代“date+%m\%d\%y-%H.%m.%s”,並在指令碼中使用它。

shell指令碼初學者指南:基礎知識

如果我們現在儲存這個指令碼,我們可以執行它,它會像我們期望的那樣給我們date命令的輸出:

shell指令碼初學者指南:基礎知識

但是,讓我們做些不同的事情。讓我們給一個變數名,比如這個命令的date\u格式。正確的語法如下:

variable=$(command –opti*** arguments)

對我們來說,我們會這樣建造:

date_formatted=$(date +%m_%d_%y-%H.%M.%S)

shell指令碼初學者指南:基礎知識

這就是我們所說的命令替換。我們實際上是告訴bash,每當變數“date\u formatted”出現時,執行括號內的命令。然後,應該顯示命令給出的任何輸出,而不是變數名“date\u formatted”。

下面是一個示例指令碼及其輸出:

shell指令碼初學者指南:基礎知識

shell指令碼初學者指南:基礎知識

請注意,輸出中有兩個空格。echo命令引號內的空格和變數前面的空格都會顯示出來。如果你不想讓他們出現,就不要用空格。還要注意,如果沒有這個新增的“echo”行,指令碼將完全沒有輸出。

讓我們回到我們的劇本。接下來讓我們新增命令的複製部分。

cp –iv $1 $2.$date_formatted

shell指令碼初學者指南:基礎知識

這將使用–i和–v選項呼叫copy命令。前者會在重寫檔案之前要求您進行驗證,後者會在命令列上顯示正在關閉的內容。

接下來,您可以看到我添加了“$1”選項。在編寫指令碼時,美元符號($)後跟一個數字將表示在呼叫指令碼時該指令碼的編號引數。例如,在以下命令中:

cp –iv Trogdor2.mp3 ringtone.mp3

第一個引數是“Trogdor2.mp3”,第二個引數是“**.mp3”.

回顧我們的指令碼,我們可以看到我們引用了兩個引數:

shell指令碼初學者指南:基礎知識

這意味著當我們執行指令碼時,我們需要提供兩個引數以使指令碼正確執行。第一個引數$1是將被複制的檔案,並被替換為“cp–iv”命令的第一個引數。

第二個引數$2將作為同一命令的輸出檔案。但是,你也可以看到這是不同的。我們添加了一個句點,並從上面引用了“date\u formatted”變數。好奇這是怎麼回事?

下面是指令碼執行時發生的情況:

shell指令碼初學者指南:基礎知識

您可以看到輸出檔案被列為我為$2輸入的內容,後跟句點,然後是date命令的輸出!有道理,對吧?

現在,當我執行datecp命令時,它將執行這個指令碼,允許我將任何檔案複製到新位置,並自動將日期和時間新增到檔名的末尾。對存檔有用!

 


Shell指令碼是讓作業系統為您工作的核心。你也不必學習一種新的程式語言來實現它。在家裡試著用一些基本的命令編寫指令碼,開始思考你可以用它做什麼。

 

你寫劇本嗎?對新手有什麼建議嗎?在評論中分享你的想法!本系列還有更多精彩!

  • 發表於 2021-04-10 05:43
  • 閱讀 ( 52 )
  • 分類:網際網路

你可能感興趣的文章

2021年面向開發者、雲工程師和devops的5大linux課程

...s課程。如果您是一名開發人員和devops工程師,對學習Linux指令碼的細微差別相當感興趣,那麼本課程將是對您的技能的一個很好的補充。 ...

  • 發佈於 2021-03-11 10:29
  • 閲讀 ( 54 )

關於arduino你一直想知道的10件事

... 但是其他語言也可以使用,包括C#、Python和一些視覺化指令碼語言,如果您完全沒有程式設計經驗的話,這些語言非常棒。 ...

  • 發佈於 2021-03-13 02:49
  • 閲讀 ( 53 )

初學者程式碼訓練營:你應該參加嗎?

...許多程式設計訓練營的重點是更新的語言和技術,以及為初學者提供的最佳程式語言。 ...

  • 發佈於 2021-03-13 09:38
  • 閲讀 ( 55 )

9個最好的pi程式設計資源,把你的樹莓pi使用

...Chin的refcard深入研究了Java程式設計。儘管如此,它仍然是初學者友好的。這個refcard涵蓋了從設定到Java程式設計以及測試I/O庫的所有內容。因此,帶有Java和Raspberry Pi refcard的DZone IoT應用程式提供了全面的軟體和硬體概述。DZone的Io...

  • 發佈於 2021-03-14 03:57
  • 閲讀 ( 51 )

頂級網站和書籍,讓您成為linux命令列英雄

... 此外,還有一個Bash指令碼部分,它解釋了可以在命令列中進行的基本程式設計。這包括變數、if語句、迴圈和函式。如果你不熟悉這些,不用擔心——它們相當簡單! ...

  • 發佈於 2021-03-14 07:04
  • 閲讀 ( 58 )

用這些免費的線上互動式shell在瀏覽器中試用python

...兩個優點。首先,您可以使用基於選項卡的介面開啟多個指令碼,第二,如果您有一個站點,您可以將韋小寶嵌入到您自己的站點中。 ...

  • 發佈於 2021-03-15 00:25
  • 閲讀 ( 52 )

學習攝影基礎知識和提高攝影技能的5種方法

... 雖然你應該閱讀攝影初學者的技巧和其他類似的文章,但它們並不能神奇地讓你變得更好。攝影是一項容易掌握的技能,就像每一項技能一樣,你需要了解基礎知識、技巧和實踐。 ...

  • 發佈於 2021-03-15 04:54
  • 閲讀 ( 48 )

10本書,所有ios應用程式開發者都需要

投入iOS開發?無論你是初學者還是經驗豐富的專家,這些書都會有幫助。 ...

  • 發佈於 2021-03-15 05:20
  • 閲讀 ( 45 )

透過5個入門課程學習gmail、google應用程式和android基礎知識

...個簡短的課程,讓你熟悉應用程式,特別是如果你是一個初學者。否則,有一張備忘單可能會有所幫助。不管是哪種方式,你都能很好地處理谷歌扔給你的任何東西。 ...

  • 發佈於 2021-03-15 13:13
  • 閲讀 ( 56 )

適合初學者的11個最佳樹莓圓周率專案

...如何透過簡單的使用者介面開啟和關閉**上的LED。提供了指令碼,因此您不需要在複雜的編碼過程中絆倒。透過檢視這些指令碼,您將學到很多關於如何為Pi設定基於web的應用程式的知識。 ...

  • 發佈於 2021-03-19 13:42
  • 閲讀 ( 57 )