【注】本文譯自: 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 腳本是一個非常有用的工具,希望您能從這篇文章中獲得靈感,讓您的想法自動化。