編寫shell腳本--編寫第一個shell腳本


學習了一些命令行工具之後,雖然這些工具可以解決很多計算問題,但是我們在使用它們的時候只能在命令中一個一個手動輸入。如果可以讓shell完成更多工作,豈不是更好?當然可以。通過自行設計,將命令行組合成程序的方式,shell就可以獨立完成一系列複雜的任務。我們可以通過編寫shell腳本方式來實現。

一、什麼是shell腳本

最簡單的解釋是,shell腳本是一個包含一系列命令的文件。shell讀取這個文件,然後執行這些命令,就好像這些命令是直接輸入到命令行一樣。
shell很獨特,因爲它既是一個強大的命令行接口,也是一個腳本語言解釋器。大多數能夠在命令行中完成的工作都可以在腳本中完成,反之亦然。

二、怎樣寫shell腳本

爲了成功創建和運行一個shell腳本,需要做三件事情。
1.編寫腳本。shell腳本是普通的文本文件。所以我們需要一個文本編輯器來編輯它。最好的文本編輯器可以提供“語法高亮”功能,從而能夠看到腳本元素彩色代碼視圖。“語法高亮”可以定位一些常見的錯誤。vim、gedit、kate和許多其他的文本編輯器都是編寫shell腳本的不錯選擇。
2.使腳本可執行。系統相當嚴格,它不會將任何老式的文本文件當作程序,所以我們需要將腳本文件的權限設置爲允許執行。
3.將腳本放置在shell能夠發現的位置。當沒有顯示指定路徑名時,shell會自動地尋找某些目錄,來查找可執行文件。爲了最大程度的方便,我們會把腳本放置在這些目錄下。

2.1、腳本文件的格式

爲了保持編程的傳統,我們將創建一個“Hello World”的程序,演示一個非常簡單的腳本。啓動文本編輯器並且輸入以下腳本,並保存爲hello_world
在這裏插入圖片描述
這個腳本的最後一行看起來非常熟悉,僅僅是一個echo命令加上一個字符串參數。第二行也很熟悉,看起來很像在很多配置文件和宗用到的註釋行。就shell腳本中的註釋來說,他們可以放置在一行的最後,如下所示:

echo 'Hello World!'  #This is a comment too

文本行中,在“#”符號後面的所有內容都會被忽略:
和很多命令一樣,它也可以在命令行中工作:
在這裏插入圖片描述
儘管命令行中的註釋沒有用,但是他們也能起作用。
腳本的第一行看起來有點神奇。喲與它以符號“#”開頭,看起來像是註釋,但是它應該具有一定的意義,所以它不僅僅是註釋。實際上,這個“#!”字符序列是一種特殊的結構,稱之爲shebang。shebang用來告訴操作系統,執行後面腳本應該使用的解釋器的名字。每一個shell腳本都應該將其作爲第一行。

2.2、可執行權限

下一步要做的事情是讓腳本可執行。使用chmod命令可以輕鬆做到:
在這裏插入圖片描述
對於腳本,有兩種常見的權限設置:權限爲755的腳本,每個人都可以執行;而權限爲700的腳本,則只有腳本所有人才能執行。注意,爲了能夠執行腳本,它必須是可讀的。

2.3、腳本文件的位置

設置完權限之後,現在來執行腳本:
在這裏插入圖片描述
爲了使腳本運行,我們必須顯示指定腳本的路徑。如果不這樣作,我們得到下面的結果:
在這裏插入圖片描述
爲何會這樣呢?是什麼讓腳步有別於程序呢?結果證明,什麼都沒有。腳本本身沒有問題,問題在於腳本的位置。如果沒有顯示指定路徑,則系統在查找一個可執行程序時,需要搜索一系列目錄。這就是當我們在命令行中輸入ls時,系統知道要執行/bin/ls的原因。/bin目錄是系統會自動搜索的一個目錄。目錄列表存放在名爲PATH的環境變量中。這個PATH變量包含一個由冒號分隔開的待搜索目錄的列表。我們可以查看PATH的內容:
在這裏插入圖片描述
我們在這裏看到了目錄列表。如果腳本位於該列表中的任何一個目錄中,問題就解決了。
我們也可以自己在PATH中添加目錄,方法是在.bashrc文件中增加下面這行:

export PATH=~/SHELL/bin:"$PATH"

修改完畢之後,它會在每一個新的終端會話中生效。爲了將這一修改應用到當前的終端,則必須讓shell重新讀取.bashrc文件。讀取的方式如下。

[wangjichuan@Jarvis ~]$ .   .bashrc

這個“.”命令和source命令相同,是shell內置命令,用來讀取一個指定的shell命令文件,並將其看做是從鍵盤中輸入的一樣。

注意:在Ubuntu系統中,如果存在~/bin目錄,則當前執行用戶的.bashrc文件時,Ubuntu系統會自動將~/bin目錄添加到PATH變量中。所以,在Ubuntu操作系統中,如果創建了~/bin目錄然後推出並重新登陸系統,一切也會正常運行。

2.4、腳本的理想位置

~/bin目錄是一個存放個人使用腳本的理想位置。如果我們編寫了一個系統上所有用戶都可以使用的腳本,則該腳本的傳統位置是/usr/local/bin。系統管理員使用的腳本通常放置在/usr/local/sbin。在大多數情況下,本地支持的軟件,無論是腳本或者是編譯好的程序,應該放置在/usr/local目錄下,而不是/bin或是/usr/bin目錄下。這些目錄都是由Linux文件系統層次結構標準指定的,只能包含由Linux發行商所提供和維護的文件。

三、編寫腳本注意事項

之所以嚴肅認真地編寫腳本,其中一個目的是爲維護提供便利。容易維護的腳本可以被它的作者或其他人員進行修改,以適應變化的要求。而讓腳本易於閱讀和理解是一種方便維護的方法。

3.1、長選項名

很多命令都有短選項名和長選項名。例如,ls命令有很多選項,他們既可以用長選項名錶示,也可以用短選項名錶示。例如:

[wangjichuan@Jarvis ~]$ ls -ad

[wangjichuan@Jarvis ~]$ ls --all --directory

這兩個命令一樣,爲了減少輸入,當在命令行中輸入選項是,短選項更可取。但是在編寫腳本時,長選項名可以提高可讀性。

3.2、縮進和行連接

當使用長選項命令時,將命令擴展爲好幾行,可以提高命令的可讀性。例如:

[wangjichuan@Jarvis ~]$ find playground \( -type f -not -perm 0600 -exec chmod 0600 '{}' ';' \) -or \( -type d -not -perm 0700 -exec chmod 0700 '{}' ';'  \)

乍一看,該命令有點難以理解。在腳本中,如果以如下方式編寫,該命令就比較容易理解了。

find playground  \
	\(  \
			-type f  \
			-not -perm 0600  \
			-exec chmod 0600 '()' ';'  \
	\)  \
	-or  \
	\(  \
			-type d  \
			-not -perm 0700  \
			-exec chmod 0700 '()' ';'  \
	\)

通過行連接符(反斜槓-回車符序列)和縮經,可以清楚地理解這個複雜命令的邏輯。該技術在命令行和宗也奏效,但是很少使用,原因就是在輸入和編輯時會相當麻煩。腳本和命令行的一個區別時,腳本可以使用製表符來實現縮進,但在命令行中,Tab鍵用來激活自動補齊功能。

爲編寫腳本而配置vim

vim文本編輯器有很多的配置項。有幾個常用的選項爲編寫腳本提供了方便。
:syntax on用來打開“語法高亮”。打開這個選項後,在查看shell時,不同的shell語法元素會以不同的顏色顯示。這對於識別某些編成錯誤很有幫助。它看起來也很酷。注意,爲了使用這種功能,必須安裝vim文本編輯器的完整版,並且編輯的文本必須含有shebang來標識這是一個shell腳本文件,如果無法設置:syntax on,可以試試:set syntax=sh
:set health用來將搜索的結果高亮顯示。比如我們查找單詞“echo”,在開啓該選項後,則所有的“echo”單詞都會高亮顯示。
:set tabstop=4用來設置Tab鍵造成的空格長度。默認值是8列。將這個值設置成4,會讓長文本行更容易適應屏幕。
:set autoindent用來開啓自動縮進特性。這個選項會讓vim對新的一行的縮進程度和上一行保持一致。對很多編程結構來說,這就加快了輸入速度,要停止縮進,則可以按下Ctrl-D。
通過把這些命令(不需要前面的冒號字符)添加到~/.vimrc文件,則這些改變會永久生效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章