Bash Shell 腳本新手指南(一)
如標(biāo)題所示,本文將涵蓋面向初學(xué)者的 Bash Shell 腳本知識(shí)。雖然本文沒(méi)有回顧 Bash 的歷史,但是有很多資源能夠便于讀者了解相關(guān)內(nèi)容,讀者也可以直接訪問(wèn) https://www.gnu.org/software/bash/ 上的 GNU 項(xiàng)目。我們會(huì)從了解一些非?;镜母拍铋_(kāi)始,然后再將相關(guān)知識(shí)綜合起來(lái)。
創(chuàng)建腳本文件
首先來(lái)創(chuàng)建一個(gè)腳本文件。我們要確保當(dāng)前目錄為家目錄。
- cd ~
在主目錄中創(chuàng)建示例文件。文件名可以是任意名稱(chēng),本文使用 learnToScript.sh 作為文件名。
- touch learnToScript.sh
此時(shí)家目錄中就生成了一個(gè)名為 learnToScript.sh 的文件。輸入以下命令以檢驗(yàn)該文件是否存在,還可以注意到其權(quán)限是 -rw-rw-r–。
- [zexcon@trinity ~]$ ls -l
- total 7
- drwxr-xr-x. 1 zexcon zexcon 90 Aug 30 13:08 Desktop
- drwxr-xr-x. 1 zexcon zexcon 80 Sep 16 08:53 Documents
- drwxr-xr-x. 1 zexcon zexcon 1222 Sep 16 08:53 Downloads
- -rw-rw-r--. 1 zexcon zexcon 70 Sep 17 10:10 learnToScript.sh
- drwxr-xr-x. 1 zexcon zexcon 0 Jul 7 16:04 Music
- drwxr-xr-x. 1 zexcon zexcon 318 Sep 15 13:53 Pictures
- drwxr-xr-x. 1 zexcon zexcon 0 Jul 7 16:04 Public
- drwxr-xr-x. 1 zexcon zexcon 0 Jul 7 16:04 Videos
- [zexcon@trinity ~]$
正式開(kāi)始之前還有一件事要做。可以試一下在沒(méi)有寫(xiě)入任何內(nèi)容的情況下執(zhí)行腳本,命令行輸入以下內(nèi)容:
- ./learnToScript.sh
- [zexcon ~]$ ./learnToScript.sh
- bash: ./learnToScript.sh: Permission denied
提示權(quán)限被拒絕,因?yàn)樵撐募](méi)有執(zhí)行權(quán)限。所以你需要更改文件的權(quán)限才能執(zhí)行腳本。
假定我們已經(jīng)了解了權(quán)限相關(guān)知識(shí),回到終端更改 learnToScript.sh 文件,增加執(zhí)行權(quán)限。輸入以下內(nèi)容:
- chmod 755 learnToScript.sh
- [zexcon@trinity ~]$ ls -l
- total 7
- drwxr-xr-x. 1 zexcon zexcon 90 Aug 30 13:08 Desktop
- drwxr-xr-x. 1 zexcon zexcon 80 Sep 16 08:53 Documents
- drwxr-xr-x. 1 zexcon zexcon 1222 Sep 16 08:53 Downloads
- -rwxr-xr-x. 1 zexcon zexcon 70 Sep 17 10:10 learnToScript.sh
- drwxr-xr-x. 1 zexcon zexcon 0 Jul 7 16:04 Music
- drwxr-xr-x. 1 zexcon zexcon 318 Sep 15 13:53 Pictures
- drwxr-xr-x. 1 zexcon zexcon 0 Jul 7 16:04 Public
- drwxr-xr-x. 1 zexcon zexcon 0 Jul 7 16:04 Videos
- [zexcon@trinity ~]$
好的,現(xiàn)在一切準(zhǔn)備就緒,你已經(jīng)獲得了 learnToScript.sh 命令的讀取、寫(xiě)入和執(zhí)行權(quán)限 (-rwxr-xr-x)。
編輯腳本文件
下面的內(nèi)容需要你熟悉 vim 或其他類(lèi)似的文本編輯器,本文選用 vim。在命令提示符下輸入以下內(nèi)容:
- vim learnToScript.sh
這會(huì)打開(kāi)一個(gè)空的文本文件,里面有一堆波浪號(hào)。鍵盤(pán)輸入 i 將進(jìn)入插入模式。通過(guò)查看終端窗口的左下角,你可以確認(rèn)它處于該模式。(友情推薦,nano 編輯器也很不錯(cuò)。)
接下來(lái)我們要確保文件被正確的解釋器識(shí)別。因此,輸入 #! 和 bash 的目錄 /bin/bash:
- #!/bin/bash
本文教程步驟的最后一件事是保存文檔。按 Esc 退出輸入模式,然后按 Shift+:。在冒號(hào)處輸入 wq,按下回車(chē)鍵,就會(huì)寫(xiě)入(w)文件并退出(q)vim 編輯器。
使用 vim 時(shí)要記住,要想寫(xiě)入文檔,就需要輸入 i,此時(shí)你會(huì)在底部看到 –INSERT–。要保存文檔,就需要按 Esc 退出輸入模式,然后按 Shift+:,輸入 w 寫(xiě)入文件;或者按 Esc,然后 Shift+: 輸入 q,實(shí)現(xiàn)退出而不保存;或者將 wq 連在一起,可以實(shí)現(xiàn)寫(xiě)入并關(guān)閉文件。Esc 本身就只是退出插入模式。你可以在其 官方網(wǎng)站 或 教程網(wǎng)站 上找到更多關(guān)于 vim 的信息。
開(kāi)始正式寫(xiě)腳本
echo 命令
echo 命令用于向終端返回一些信息,可以使用單引號(hào)、雙引號(hào)或不使用引號(hào)。那么讓我們用一個(gè)傳統(tǒng)的 Hello World 來(lái)試試它!
- #!/bin/bash
- echo Hello World!
- echo 'Hello World!'
- echo "Hello World!"
- [zexcon ~]$ ./learnToScript.sh
- Hello World!
- Hello World!
- Hello World!
- [zexcon ~]$
注意,上述三行得到了相同的結(jié)果。使用單引號(hào)、雙引號(hào)或不使用引號(hào)的結(jié)果不是一定相同的,但在這個(gè)基本腳本中確實(shí)得到了同樣的結(jié)果。在某些情況下,引號(hào)的類(lèi)型不同會(huì)導(dǎo)致結(jié)果差異。至此恭喜你編寫(xiě)了第一個(gè) Bash 腳本。當(dāng)你繼續(xù)創(chuàng)建更多腳本并放飛你的想法時(shí),可能會(huì)需要了解以下更多的知識(shí)。
命令替換 $( ) 和 ` `
命令替換可以實(shí)現(xiàn)以下效果:獲取在命令行執(zhí)行命令的結(jié)果,并將該結(jié)果寫(xiě)入變量。例如,如果在命令提示符下輸入 ls,可以獲得當(dāng)前工作目錄的列表。我們用這個(gè)命令來(lái)實(shí)踐一下。命令替換選項(xiàng)有兩個(gè),請(qǐng)注意:第一個(gè)選項(xiàng)使用鍵盤(pán)左側(cè) Tab 鍵上方的反引號(hào)。它與波浪號(hào) ~ 在一個(gè)鍵位上。第二個(gè)選項(xiàng)使用 shell 變量。
- #!/bin/bash
- command1=`ls`
- echo $command1
- command2=$(ls)
- echo $command2
- [zexcon ~]$ ./learnToScript.sh
- Desktop Documents Downloads learnToScript.sh Music Pictures Public snap Videos
- Desktop Documents Downloads learnToScript.sh Music Pictures Public snap Videos
- [zexcon ~]$
注意變量、等號(hào)和命令開(kāi)頭之間不要有空格。使用這兩個(gè)選項(xiàng)得到的結(jié)果是完全相同的。請(qǐng)注意,變量需要以美元符號(hào)開(kāi)頭。如果你忘記了,并且回顯了不帶美元符號(hào)的命令變量,會(huì)只輸出命令的名稱(chēng),如下所示:
- #!/bin/bash
- command1=`ls`
- echo command1
- command2=$(ls)
- echo command2
- [zexcon ~]$ ./learnToScript.sh
- command1
- command2
- [zexcon ~]$
雙括號(hào) (())
那么雙括號(hào)有什么用呢? 很簡(jiǎn)單,雙括號(hào)用于數(shù)學(xué)方程式。
- #!/bin/bash
- echo $((5+3))
- echo $((5-3))
- echo $((5*3))
- echo $((5/3))
- [zexcon ~]$ ./learnToScript.sh
- 8
- 2
- 15
- 1
- [zexcon ~]$
結(jié)語(yǔ)
至此,我們已經(jīng)創(chuàng)建了第一個(gè)腳本。我們知道了如何執(zhí)行多個(gè)命令:將它們放在一個(gè)腳本中并運(yùn)行,就可以獲得結(jié)果。下一篇文章會(huì)繼續(xù)討論,了解輸入和輸出的重定向、管道命令、使用雙括號(hào)或者添加注釋等知識(shí)。