什麼是Shell指令碼。
Shell指令碼(英語:Shell script)是一種電腦程式與文字檔,內容由一連串的shell命令組成,經由Unix Shell直譯其內容後運作。被當成是一種指令碼語言來設計,其運作方式與直譯語言相當,由Unix shell扮演命令列解譯器的角色,在讀取shell script之後,依序運行其中的shell命令,之後輸出結果。利用Shell script可以進行系統管理,檔案操作等。
在Unix及所有的類Unix系統中,如Linux、FreeBSD等作業系統,都存在Shell Script。依照Unix shell的各種不同類型,Shell script也有各種不同方言。在DOS、OS/2、Microsoft Windows中的批次檔,跟shell script有類似的功能。
來看一個執行個體
#!/bin/shcd ~mkdir shell_tutcd shell_tutfor ((i=0; i<10; i++)); do touch test_$i.txtdone
執行個體解析: 第1行:指定指令碼解譯器,這裡是用/bin/sh做解譯器的 第2行:切換到目前使用者的home目錄 第3行:建立一個目錄shell_tut 第4行:切換到shell_tut目錄 第5行:迴圈條件,一共迴圈10次 第6行:建立一個test_1…10.txt檔案 第7行:迴圈體結束
cd, mkdir, touch都是系統內建的程式,一般在/bin或者/usr/bin目錄下。for, do, done是sh指令碼語言的關鍵字。 環境
shell編程跟java、php編程一樣,只要有一個能編寫代碼的文字編輯器和一個能解釋執行的指令碼解譯器就可以了。
當前主流的作業系統都支援shell編程,本文檔所述的shell編程是指Linux下的shell,講的基本都是POSIX標準下的功能,所以,也適用於Unix及BSD(如Mac OS)。 Linux
Linux預設安裝就帶了shell解譯器。 Mac OS
Mac OS不僅帶了sh、bash這兩個最基礎的解譯器,還內建了ksh、csh、zsh等不常用的解譯器。 Windows上的模擬器
windows出廠時沒有內建shell解譯器,需要自行安裝,為了同時能用grep, awk, curl等工具,最好裝一個cygwin或者mingw來類比linux環境。 cygwin mingw 指令碼解譯器 sh
即Bourne shell,POSIX(Portable Operating System Interface)標準的shell解譯器,它的二進位檔案路徑通常是/bin/sh,由Bell Labs開發。 bash
Bash是Bourne shell的替代品,屬GNU Project,二進位檔案路徑通常是/bin/bash。業界通常混用bash、sh、和shell,比如你會經常在招聘營運工程師的文案中見到:熟悉Linux Bash編程,精通Shell編程。
在CentOS裡,/bin/sh是一個指向/bin/bash的符號連結:
[root@centosraw ~]# ls -l /bin/*sh-rwxr-xr-x. 1 root root 903272 Feb 22 05:09 /bin/bash-rwxr-xr-x. 1 root root 106216 Oct 17 2012 /bin/dashlrwxrwxrwx. 1 root root 4 Mar 22 10:22 /bin/sh -> bash
但在Mac OS上不是,/bin/sh和/bin/bash是兩個不同的檔案,儘管它們的大小隻相差100位元組左右:
iMac:~ wuxiao$ ls -l /bin/*sh-r-xr-xr-x 1 root wheel 1371648 6 Nov 16:52 /bin/bash-rwxr-xr-x 2 root wheel 772992 6 Nov 16:52 /bin/csh-r-xr-xr-x 1 root wheel 2180736 6 Nov 16:52 /bin/ksh-r-xr-xr-x 1 root wheel 1371712 6 Nov 16:52 /bin/sh-rwxr-xr-x 2 root wheel 772992 6 Nov 16:52 /bin/tcsh-rwxr-xr-x 1 root wheel 1103984 6 Nov 16:52 /bin/zsh
進階程式設計語言
理論上講,只要一門語言提供瞭解釋器(而不僅是編譯器),這門語言就可以勝任指令碼編程,常見的解釋型語言都是可以用作指令碼編程的,如:Perl、Tcl、Python、PHP、Ruby。Perl是最老牌的指令碼程式設計語言了,Python這些年也成了一些linux發行版的預置解譯器。
編譯型語言,只要有解譯器,也可以用作指令碼編程,如C shell是內建的(/bin/csh),Java有第三方解譯器Jshell,Ada有收費的解譯器AdaScript。
如下是一個PHP Shell Script樣本(假設檔案名稱叫test.php):
#!/usr/bin/php<?phpfor ($i=0; $i < 10; $i++) { echo $i . "\n";}
執行:
/usr/bin/php test.php
或者:
chmod +x test.php./test.php
如何選擇shell程式設計語言 熟悉 vs 陌生
如果你已經掌握了一門程式設計語言(如PHP、Python、Java、JavaScript),建議你就直接使用這門語言編寫指令碼程式,雖然某些地方會有點囉嗦,但你能利用在這門語言領域裡的經驗(單元測試、單步調試、IDE、第三方類庫)。
新增的學習成本很小,只要學會怎麼使用shell解譯器(Jshell、AdaScript)就可以了。 簡單 vs 進階
如果你覺得自己熟悉的語言(如Java、C)寫shell指令碼實在太囉嗦,你只是想做一些備份檔案、安裝軟體、下載資料之類的事情,學著使用sh,bash會是一個好主意。
shell只定義了一個非常簡單的程式設計語言,所以,如果你的指令碼程式複雜度較高,或者要操作的資料結構比較複雜,那麼還是應該使用Python、Perl這樣的指令碼語言,或者是你本來就已經很擅長的進階語言。因為sh和bash在這方面很弱,比如說: 它的函數只能返回字串,無法返回數組 它不支援物件導向,你無法實現一些優雅的設計模式 它是解釋型的,一邊解釋一邊執行,連PHP那種先行編譯都不是,如果你的指令碼包含錯誤(例如調用了不存在的函數),只要沒執行到這一行,就不會報錯 環境相容性
如果你的指令碼是提供給別的使用者使用,使用sh或者bash,你的指令碼將具有最好的環境相容性,perl很早就是linux標配了,python這些年也成了一些linux發行版的標配,至於mac os,它預設安裝了perl、python、ruby、php、java等主流程式設計語言。 第一個shell指令碼 編寫
開啟文字編輯器,建立一個檔案,副檔名為sh(sh代表shell),副檔名並不影響指令碼執行,見名知意就好,如果你用php寫shell 指令碼,副檔名就用php好了。
輸入一些代碼,第一行一般是這樣:
#!/bin/bash#!/usr/bin/php
"#!"是一個約定的標記,它告訴系統這個指令碼需要什麼解譯器來執行。 運行
運行Shell指令碼有兩種方法:
運行Shell指令碼有兩種方法: 作為可執行程式
chmod +x test.sh./test.sh
注意,一定要寫成./test.sh,而不是test.sh,運行其它二進位的程式也一樣,直接寫test.sh,linux系統會去PATH裡尋找有沒有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH裡,你的目前的目錄通常不在PATH裡,所以寫成test.sh是會找不到命令的,要用./test.sh告訴系統說,就在目前的目錄找。
通過這種方式運行bash指令碼,第一行一定要寫對,好讓系統尋找到正確的解譯器。
這裡的"系統",其實就是shell這個應用程式(想象一下Windows Explorer),但我故意寫成系統,是方便理解,既然這個系統就是指shell,那麼一個使用/bin/sh作為解譯器的指令碼是不是可以省去第一行呢。是的。 作為解譯器參數
這種運行方式是,直接運行解譯器,其參數就是shell指令碼的檔案名稱,如:
/bin/sh test.sh/bin/php test.php
這種方式啟動並執行指令碼,不需要在第一行指定解譯器資訊,寫了也沒用。
from: http://www.runoob.com/w3cnote/shell-quick-start.html