【注】本文譯自: An Introduction to Bash Scripting
Bash 指令碼簡介
幻想自己是電腦科學家、業餘愛好者或技術書呆子嗎?然後在某個時候,您將或應該考慮在您的數字工作區中使用 Bash 指令碼。
Bash (Bourne Again Shell)") 是一個直譯器,負責處理Unix系統命令列上的命令。它是由 Brian Fox 編寫的免費軟體,並於 1989 年釋出的免費軟體,作為 Sh(Bourne Shell)的替代品。Bash 被開發人員、資料科學家、系統管理員、網路工程師和任何其他在日常工作中嚴重依賴 Unix 作業系統的人使用。一般來說,Bash 指令碼用於自動化電腦科學家可能承擔的日常補救任務。簡而言之,shell 指令碼只不過是儲存在一個檔案(如列表)中的一系列命令。
您可以在 Linux 和 MacOS 機器上使用 Bash,甚至可以通過適用於 Linux 的 Windows 子系統在 Windows 10 機器上使用。Bash 通常在文字視窗中執行,使用者可以在其中鍵入命令讓計算機執行操作。該語言還可用於從檔案讀取和執行命令,稱為 shell 指令碼。Shell 指令碼本身就是一種程式語言,與任何其他語言一樣,Bash 是一種可以以多種方式使用的工具。
如果您之前見過執行 Linux 作業系統(或類 Unix 環境)的機器,您可能也見過終端控制檯。終端是使用者使用某些命令與 shell 直譯器進行互動的方式。諸如 cd 導航檔案目錄,ls 列出當前目錄中的檔案,以及 nano 編輯檔案等命令。
在終端中使用 Bash 程式碼,它將由 Bash 直譯器執行。ls 之類的命令是位於 /bin 目錄中的二進位制可執行檔案。 當 shell 收到該命令時(當您在終端中鍵入它並按 Enter 鍵時),它會執行 ls 檔案併為使用者列出當前目錄中的檔案。使用命令 ls /bin 以路徑 /bin 作為選項執行二進位制 ls,列出 /bin 目錄中的檔案。執行 ls -al 會執行帶有標誌 -a 和 -l 作為選項的 ls 命令,列出當前目錄路徑中的所有檔案和目錄以及有關這些專案的詳細資訊。
touch 是另一個這樣的二進位制可執行檔案,使用者可以在終端中使用的命令。 此命令的輸出是一個新檔案,使用者輸入的名稱作為選項。例如,使用者可以編寫 touch hello.txt,輸出將是一個檔案 hello.txt。
如何執行多個 Bash 命令
要執行多個 Bash 命令並讓它們一次執行,使用者可以將這些命令儲存在單個檔案中,以便用 bash 執行。假設您在 Unix/類 Unix 環境中工作,讓我們考慮一下我們之前討論過的內容。
開啟命令終端後,首先使用您喜歡的文字編輯器,例如 nano 或 vi。寫入:
nano make_a_file.txt
然後,寫出以下內容:
#create a file
touch hello.txt
#list files from this directory
ls -al
儲存並退出檔案,並使用以下命令語法之一執行新指令碼:
sh make_a_file.txt
或
./make_a_file.txt
或
bash make_a_file.txt
如果執行該檔案時出錯,請通過輸入以下內容繼續為您剛剛編寫的指令碼檔案設定可執行許可權:
chmod +x hello.sh
如果您遵循了這個示例,那麼您剛剛建立了一個包含多個 Bash 命令的檔案。Bash 直譯器將按順序執行這些命令並忽略以雜湊符號 # 開頭的行,因為這些行是註釋。執行該檔案會產生一個檔案列表的終端輸出,其中將包含一個 hello.txt,之前沒有。
通常,一個 Bash 指令碼檔案以包含 .sh 副檔名的格式儲存,這表明該檔案是一個 shell 指令碼。但是,當檔案以“she-bang”或“hashbang”開頭時,我們可以像二進位制檔案一樣執行它。
在建立指令碼時,我們應該考慮到每個二進位制 shell 檔案都以俗稱的“she-bang”(也稱為 sh-bang 或 hashbang)開頭。這是指令碼標題的開始,第一行程式碼指示您將使用哪個 shell。在製作指令碼時,我們有多種選擇可供選擇,包括 shell (sh)、C Shell、Z Shell 等。在這種情況下,我們將繼續使用 Bash 來滿足我們的指令碼需求。She-bang 是指令碼開頭的一組符號“#”和“!”。我們知道井號 (#) 表示一行是註釋。 然而,使用 she-bang,類 Unix 系統的程式直譯器會將第一行的其餘部分解析為直譯器指令。在這種情況下,在寫入 #!/bin/bash 時,雜湊符號和感嘆號作為程式載入器的指示符,指示它使用位於 /bin/bash 目錄的 Bash Shell 程式。
如何在 Bash 中建立變數
像大多數其他 Unix shell 一樣,Bash 具有變數、管道、檔名萬用字元、here 文件、命令替換和控制流。Bash 還支援交替(它與 C shell 共享)、命令列完成以及訊號處理和基本除錯。有了這些特性,bash 成為 Unix 和類 Unix 系統的預設命令直譯器也就不足為奇了。
像其他程式語言一樣,我們可以在使用 Bash 編寫指令碼時宣告變數。但是,與其他語言不同,Bash 不需要關鍵字來宣告變數或為其分配資料型別。Bash 沒有型別系統,僅將變數儲存為字串值。但是,Bash 可以根據某些操作(例如算術運算)自動將變數轉換為合適的型別。要寫入變數併為其填充值,請以 VARIABLE=VALUE 格式寫入內容,確保不包含空格。下面是一個示例,展示瞭如何在 Bash 中建立變數:
#!/bin/bash
#write a variable
NAME=“William”
#use that variable
echo “Hello $NAME”
使用者還可以通過使用者輸入來填充變數:
#!/bin/bash
echo “Hello $1, that is a $2 name”
在終端中:
~$bash name.sh “William” “great”
Hello William, that is a great name
還可以使用 read 之類的命令在執行時使用使用者輸入的變數:
#!/bin/bash
echo “What is your name?”
read name
echo “Hello $name”
在終端中:
~$bash name.sh
What is your name?
~$William
Hello William
Bash 中的 if 語句
我們還可以為附加功能實現 if 語句。
#!/bin/bash
echo “Who is there?”
read name
if [ $name ]
echo “Hello $name”
else
echo “Must’ve been my imagination”
fi
在終端中:
~$bash name.sh
Who is there?
~$
Must’ve been my imagination
如何在 Bash 中建立備份管理指令碼
其他需要考慮的專案包括設定備份管理指令碼。這可以是一個簡單的專案,可以開始並在以後重新訪問。有了這個,您可以製作一個簡單的指令碼,針對一個或多個檔案和資料夾使用 tar 庫進行壓縮,並將其放置在您選擇的新備份目錄中。以下指令碼是一個基本的備份指令碼,它為需要備份的檔案建立一個 .Zip 檔案,並根據建立日期對它們進行標記:
#!/bin/bash
#get the month, day, and year of the current date
TIME_OF_BACKUP=`date +%m-%d-%y`
#create a backup file using the current date in its name
DESTINATION=/path/[BACKUP FOLDER]-$TIME_OF_BACKUP.tar.gz
#the folder that contains the files that we want to backup
TARGET_FOLDER=/path/[TARGET FOLDER]
#create the backup
tar -cpzf $DESTINATION $TARGET_FOLDER
作為獎勵,您可能希望通過為備份指令碼新增計劃執行來增加此專案的一些複雜性,並增加自動化級別。為此,您可以使用 crontab 程式和命令庫。如果您需要安裝 cron,請確保在繼續安裝 cron 之前更新您當前的包庫。
sudo apt-get update
sudo apt-get install cron
成功安裝後,您可以繼續使用 cron 庫來安排指令碼的執行。
crontab -e
這將開啟 /etc/crontab 檔案,並允許您編寫如下命令來安排指令碼的執行:
@weekly /path/backup_script.sh
我不會進一步討論您可以使用 crontab 做什麼,因為它不在本文的範圍內。
總結
通過本入門指南,您將對什麼是 Bash、什麼是指令碼以及 Bash 中的指令碼有什麼瞭解。你可以用 Bash 做很多事情,而且你不需要了解很多關於程式設計的知識,就可以將不同的 Linux 應用程式和工具拼湊在一起,並製作一些有用的東西。Bash 指令碼是一個非常有用的工具,希望您能從這篇文章中獲得靈感,讓您的想法自動化。