Bash 腳本簡(jiǎn)介
【注】本文譯自: An Introduction to Bash Scripting

幻想自己是計(jì)算機(jī)科學(xué)家、業(yè)余愛好者或技術(shù)書呆子嗎?然后在某個(gè)時(shí)候,您將或應(yīng)該考慮在您的數(shù)字工作區(qū)中使用 Bash 腳本。
Bash (Bourne Again Shell)?是一個(gè)解釋器,負(fù)責(zé)處理Unix系統(tǒng)命令行上的命令。它是由?Brian Fox 編寫的免費(fèi)軟件,并于 1989 年發(fā)布的免費(fèi)軟件,作為 Sh(Bourne Shell)的替代品。Bash 被開發(fā)人員、數(shù)據(jù)科學(xué)家、系統(tǒng)管理員、網(wǎng)絡(luò)工程師和任何其他在日常工作中嚴(yán)重依賴 Unix 操作系統(tǒng)的人使用。一般來說,Bash 腳本用于自動(dòng)化計(jì)算機(jī)科學(xué)家可能承擔(dān)的日常補(bǔ)救任務(wù)。簡(jiǎn)而言之,shell 腳本只不過是存儲(chǔ)在一個(gè)文件(如列表)中的一系列命令。
您可以在?Linux?和 MacOS 機(jī)器上使用 Bash,甚至可以通過適用于 Linux 的 Windows 子系統(tǒng)在 Windows 10 機(jī)器上使用。Bash 通常在文本窗口中運(yùn)行,用戶可以在其中鍵入命令讓計(jì)算機(jī)執(zhí)行操作。該語(yǔ)言還可用于從文件讀取和執(zhí)行命令,稱為 shell 腳本。Shell 腳本本身就是一種編程語(yǔ)言,與任何其他語(yǔ)言一樣,Bash 是一種可以以多種方式使用的工具。
如果您之前見過運(yùn)行 Linux 操作系統(tǒng)(或類 Unix 環(huán)境)的機(jī)器,您可能也見過終端控制臺(tái)。終端是用戶使用某些命令與 shell 解釋器進(jìn)行交互的方式。諸如?cd?導(dǎo)航文件目錄,ls?列出當(dāng)前目錄中的文件,以及?nano?編輯文件等命令。

在終端中使用 Bash 代碼,它將由 Bash 解釋器運(yùn)行。ls?之類的命令是位于?/bin?目錄中的二進(jìn)制可執(zhí)行文件。 當(dāng) shell 收到該命令時(shí)(當(dāng)您在終端中鍵入它并按 Enter 鍵時(shí)),它會(huì)執(zhí)行?ls?文件并為用戶列出當(dāng)前目錄中的文件。使用命令?ls /bin?以路徑?/bin?作為選項(xiàng)執(zhí)行二進(jìn)制?ls,列出?/bin?目錄中的文件。執(zhí)行?ls -al?會(huì)運(yùn)行帶有標(biāo)志?-a?和?-l?作為選項(xiàng)的?ls?命令,列出當(dāng)前目錄路徑中的所有文件和目錄以及有關(guān)這些項(xiàng)目的詳細(xì)信息。
touch?是另一個(gè)這樣的二進(jìn)制可執(zhí)行文件,用戶可以在終端中使用的命令。 此命令的輸出是一個(gè)新文件,用戶輸入的名稱作為選項(xiàng)。 例如,用戶可以編寫?touch hello.txt,輸出將是一個(gè)文件?hello.txt。
如何運(yùn)行多個(gè) Bash 命令
要運(yùn)行多個(gè)?Bash?命令并讓它們一次執(zhí)行,用戶可以將這些命令保存在單個(gè)文件中,以便用 bash 執(zhí)行。假設(shè)您在 Unix/類 Unix 環(huán)境中工作,讓我們考慮一下我們之前討論過的內(nèi)容。
打開命令終端后,首先使用您喜歡的文本編輯器,例如?nano?或?vi。寫入:
nano make_a_file.txt
然后,寫出以下內(nèi)容:
#create a filetouch hello.txt#list files from this directoryls -al
保存并退出文件,并使用以下命令語(yǔ)法之一運(yùn)行新腳本:
sh make_a_file.txt
或
./make_a_file.txt
或
bash make_a_file.txt
如果執(zhí)行該文件時(shí)出錯(cuò),請(qǐng)通過輸入以下內(nèi)容繼續(xù)為您剛剛編寫的腳本文件設(shè)置可執(zhí)行權(quán)限:
chmod +x hello.sh
如果您遵循了這個(gè)示例,那么您剛剛創(chuàng)建了一個(gè)包含多個(gè) Bash 命令的文件。Bash 解釋器將按順序運(yùn)行這些命令并忽略以哈希符號(hào) # 開頭的行,因?yàn)檫@些行是注釋。運(yùn)行該文件會(huì)產(chǎn)生一個(gè)文件列表的終端輸出,其中將包含一個(gè)?hello.txt,之前沒有。
通常,一個(gè) Bash 腳本文件以包含?.sh?擴(kuò)展名的格式保存,這表明該文件是一個(gè) shell 腳本。但是,當(dāng)文件以“she-bang”或“hashbang”開頭時(shí),我們可以像二進(jìn)制文件一樣執(zhí)行它。
在創(chuàng)建腳本時(shí),我們應(yīng)該考慮到每個(gè)二進(jìn)制 shell 文件都以俗稱的“she-bang”(也稱為 sh-bang 或 hashbang)開頭。這是腳本標(biāo)題的開始,第一行代碼指示您將使用哪個(gè) shell。在制作腳本時(shí),我們有多種選擇可供選擇,包括?shell (sh)、C Shell、Z Shell?等。在這種情況下,我們將繼續(xù)使用 Bash 來滿足我們的腳本需求。She-bang 是腳本開頭的一組符號(hào)“#”和“!”。我們知道井號(hào) (#) 表示一行是注釋。 然而,使用 she-bang,類 Unix 系統(tǒng)的程序解釋器會(huì)將第一行的其余部分解析為解釋器指令。在這種情況下,在寫入?#!/bin/bash?時(shí),哈希符號(hào)和感嘆號(hào)作為程序加載器的指示符,指示它使用位于?/bin/bash?目錄的 Bash Shell 程序。
如何在 Bash 中創(chuàng)建變量
像大多數(shù)其他 Unix shell 一樣,Bash 具有變量、管道、文件名通配符、here 文檔、命令替換和控制流。Bash 還支持交替(它與 C shell 共享)、命令行完成以及信號(hào)處理和基本調(diào)試。有了這些特性,bash 成為 Unix 和類 Unix 系統(tǒng)的默認(rèn)命令解釋器也就不足為奇了。
像其他編程語(yǔ)言一樣,我們可以在使用 Bash 編寫腳本時(shí)聲明變量。但是,與其他語(yǔ)言不同,Bash 不需要關(guān)鍵字來聲明變量或?yàn)槠浞峙鋽?shù)據(jù)類型。Bash 沒有類型系統(tǒng),僅將變量保存為字符串值。但是,Bash?可以根據(jù)某些操作(例如算術(shù)運(yùn)算)自動(dòng)將變量轉(zhuǎn)換為合適的類型。要寫入變量并為其填充值,請(qǐng)以?VARIABLE=VALUE?格式寫入內(nèi)容,確保不包含空格。下面是一個(gè)示例,展示了如何在 Bash 中創(chuàng)建變量:
#write a variableNAME=“William”#use that variableecho “Hello $NAME”
用戶還可以通過用戶輸入來填充變量:
echo “Hello $1, that is a $2 name”
在終端中:
~$bash name.sh “William” “great”
Hello William, that is a great name
還可以使用?read?之類的命令在運(yùn)行時(shí)使用用戶輸入的變量:
echo “What is your name?”read nameecho “Hello $name”
在終端中:
~$bash name.sh
What is your name?
~$WilliamHello William
Bash 中的 if 語(yǔ)句
我們還可以為附加功能實(shí)現(xiàn)?if?語(yǔ)句。
echo “Who is there?”read nameif [ $name ]echo “Hello $name”else
echo “Must’ve been my imagination”fi
在終端中:
~$bash name.sh
Who is there?
~$
Must’ve been my imagination
如何在 Bash 中創(chuàng)建備份管理腳本
其他需要考慮的項(xiàng)目包括設(shè)置備份管理腳本。這可以是一個(gè)簡(jiǎn)單的項(xiàng)目,可以開始并在以后重新訪問。有了這個(gè),您可以制作一個(gè)簡(jiǎn)單的腳本,針對(duì)一個(gè)或多個(gè)文件和文件夾使用 tar 庫(kù)進(jìn)行壓縮,并將其放置在您選擇的新備份目錄中。以下腳本是一個(gè)基本的備份腳本,它為需要備份的文件創(chuàng)建一個(gè) .Zip 文件,并根據(jù)創(chuàng)建日期對(duì)它們進(jìn)行標(biāo)記:
#get the month, day, and year of the current dateTIME_OF_BACKUP=`date +%m-%d-%y`#create a backup file using the current date in its nameDESTINATION=/path/[BACKUP FOLDER]-$TIME_OF_BACKUP.tar.gz#the folder that contains the files that we want to backupTARGET_FOLDER=/path/[TARGET FOLDER]#create the backuptar -cpzf $DESTINATION $TARGET_FOLDER
作為獎(jiǎng)勵(lì),您可能希望通過為備份腳本添加計(jì)劃執(zhí)行來增加此項(xiàng)目的一些復(fù)雜性,并增加自動(dòng)化級(jí)別。為此,您可以使用 crontab 程序和命令庫(kù)。如果您需要安裝 cron,請(qǐng)確保在繼續(xù)安裝 cron 之前更新您當(dāng)前的包庫(kù)。
sudo apt-get updatesudo apt-get install cron
成功安裝后,您可以繼續(xù)使用 cron 庫(kù)來安排腳本的執(zhí)行。
crontab -e
這將打開?/etc/crontab?文件,并允許您編寫如下命令來安排腳本的執(zhí)行:
@weekly /path/backup_script.sh
我不會(huì)進(jìn)一步討論您可以使用?crontab?做什么,因?yàn)樗辉诒疚牡姆秶鷥?nèi)。
通過本入門指南,您將對(duì)什么是 Bash、什么是腳本以及 Bash 中的腳本有什么了解。你可以用 Bash 做很多事情,而且你不需要了解很多關(guān)于編程的知識(shí),就可以將不同的 Linux 應(yīng)用程序和工具拼湊在一起,并制作一些有用的東西。Bash 腳本是一個(gè)非常有用的工具,希望您能從這篇文章中獲得靈感,讓您的想法自動(dòng)化。