shell
Shell腳本基本語法和應用
概念和原理
Shell是什麼?linux
- Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋樑。
- Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶經過這個界面訪問操做系統內核的服務,用戶的大部分工做都是經過Shell完成的
- 在Unix和linux上的內核上執行
- shell是最重要的實用程序,深刻了解和熟練掌握shell的特性極其使用方法,是用好Unix/Linux系統的關鍵
Shell腳本git
- Shell 腳本(shell script),是一種爲 shell 編寫的腳本程序。
- 業界所說的 shell 一般都是指 shell 腳本,但讀者朋友要知道,shell 和 shell script 是兩個不一樣的概念
- Shell腳本語言既是一種命令語言,又是一種程序設計語言
- Shell腳本和編程語言很類似,也有變量和流程控制語句,但Shell腳本是解釋執行的,不須要編譯
- Shell程序從腳本中一行一行讀取並執行這些命令,至關於一個用戶把腳本中的命令一行一行敲到Shell提示符下執行
Shell有兩種執行命令的方式github
交互式(Interactive):解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條。web
批處理(Batch):用戶事先寫一個Shell腳本(Script),其中有不少條命令,讓Shell一次把這些命令執行完,而沒必要一條一條地敲命令。shell
能夠經過打印"$-"變量的值(表明着當前設置的Shell選項),來區分交互式與非交互式Shell。編程
[root@qiudao ~]# echo $-
himBH #交互式Shell
[root@qiudao ~]# cat 1.sh
#!/bin/bash
echo $-
[root@qiudao ~]# sh 1.sh
hB #非交互式Shell
#各個字符所表明的含義:
01)h:hashall,打開這個選項後,Shell會將命令所在的路徑記錄下來,避免每次都要查詢。
02)i:interactive,包含這個選項說明當前的Shell是一個交互式的Shell。
03)m:monitor,打開監控模式,就能夠經過Job control來控制進程的中止、繼續,後臺或者前臺執行等。
04)B:braceexpand,大括號擴展。
05)H:history,Shell會把咱們執行的命令記錄下來,能夠經過history命令查看。
幾種常見Shell(Shell腳本解釋權器)ruby
- Unix/Linux上常見的Shell腳本解釋器有bash、sh、csh、ksh等,習慣上把它們稱做一種Shell。咱們常說有多少種Shell,其實說的是Shell腳本解釋器。
- bash:bash是Linux標準默認的shell,bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的縮寫,內部命令一共有40個,Linux使用它做爲默認的shell是由於它有諸如如下的特點:
- 可使用相似DOS下面的doskey的功能,用方向鍵查閱和快速輸入並修改命令
- 自動經過查找匹配的方式給出以某字符串開頭的命令
- 包含了自身的幫助功能,你只要在提示符下面鍵入help就能夠獲得相關的幫助
- sh:sh 由Steve Bourne開發,是Bourne Shell的縮寫,sh 是Unix 標準默認的shell
- ash:ash shell 是由Kenneth Almquist編寫的,Linux中佔用系統資源最少的一個小shell,它只包含24個內部命令,於是使用起來很不方便
- csh:csh 是Linux比較大的內核,它由以William Joy爲表明的共計47位做者編成,共有52個內部命令。該shell實際上是指向/bin/tcsh這樣的一個shell,也就是說,csh其實就是tcsh
- ksh:ksh 是Korn shell的縮寫,由Eric Gisin編寫,共有42條內部命令。該shell最大的優勢是幾乎和商業發行版的ksh徹底兼容,這樣就能夠在不用花錢購買商業版本的狀況下嘗試商業版本的性能了
注意:bash是 Bourne Again Shell 的縮寫,是linux標準的默認shell ,它基於Bourne shell,吸取了C shell和Korn shell的一些特性。bash徹底兼容sh,也就是說,用sh寫的腳本能夠不加修改的在bash中執行bash
編譯型語言和解釋型語言的區別數據結構
- 編譯型語言
不少傳統的程序設計語言,例如Fortran、Ada、Pascal、C、C++和Java,都是編譯型語言。這類語言須要預先將咱們寫好的源代碼(source code)轉換成目標代碼(object code),這個過程被稱做「編譯」
- 優勢:因爲編譯後的目標代碼(object code)很是接近計算機底層,所以執行效率很高
- 缺點:因爲編譯型語言多半運做於底層,所處理的是字節、整數、浮點數或是其餘機器層級的對象,每每實現一個簡單的功能須要大量複雜的代碼
- 解釋型語言
解釋型語言也被稱做「腳本語言」。執行這類程序時,解釋器(interpreter)須要讀取咱們編寫的源代碼(source code),並將其轉換成目標代碼(object code),再由計算機運行
- 優勢:它們多半運行在比編譯型語言還高的層級,可以輕易處理文件與目錄之類的對象;缺點是它們的效率一般不如編譯型語言
- 缺點:由於每次執行程序都多了編譯的過程,所以效率有所降低
不過權衡之下,一般使用腳本編程仍是值得的:花一個小時寫成的簡單腳本,一樣的功能用C或C++來編寫實現,可能須要兩天,並且通常來講,腳本執行的速度已經夠快了,快到足以讓人忽略它性能上的問題。腳本編程語言的例子有awk、Perl、Python、Ruby與Shell編程語言
應用場景
Shell腳本能夠提升工做效率
由於Shell彷佛是各UNIX系統之間通用的功能,而且通過了POSIX的標準化。所以,Shell腳本只要「用心寫」一次,便可應用到不少系統上。所以,之因此要使用Shell腳本是基於:
- 簡單性:Shell是一個高級語言;經過它,你能夠簡潔地表達複雜的操做。
- 可移植性:使用POSIX所定義的功能,能夠作到腳本無須修改就可在不一樣的系統上執行。
- 開發容易:能夠在短期內完成一個功能強大又好用的腳本
可是,考慮到Shell腳本的命令限制和效率問題,下列狀況通常不使用Shell:
- 資源密集型的任務,尤爲在須要考慮效率時(好比,排序,hash等等)
- 須要處理大任務的數學操做,尤爲是浮點運算,精確運算,或者複雜的算術運算(這種狀況通常使用C++或FORTRAN 來處理)
- 有跨平臺(操做系統)移植需求(通常使用C 或Java)
- 複雜的應用,在必須使用結構化編程的時候(須要變量的類型檢查,函數原型,等等)
- 對於影響系統全局性的關鍵任務應用
- 私人的、閉源的應用(shell 腳本把代碼就放在文本文件中,全世界都能看到)
- 須要數據結構的支持,好比鏈表或數等數據結構。
- 須要產生或操做圖形化界面 GUI
- 須要直接操做系統硬件
綜上,結合Shell的優缺點和特性,咱們使用Shel能夠作下面一些事情:
- 將一些複雜的命令簡單化(平時咱們提交一次github代碼可能須要不少步驟,可是能夠用Shell簡化成一步)
- 能夠寫一些腳本實現工程自動化操做,好比自動更換最新的sdk(庫).
- 自動打包、編譯、發佈等功能
- 清理磁盤中空文件夾
- 總之一切有規律的活腳本均可以嘗試一下
基本語法
放在相同目錄 /server/scriptes/
第一個shell腳本
hello world!
執行腳本的三種方式
1)bash test.sh
[root@web01 scripts]# bash test.sh
Hello World!
2)全路徑執行
[root@web01 scripts]# chmod +x test.sh
[root@web01 scripts]# /server/scripts/test.sh
Hello World!
3). 或者source執行
[root@web01 scripts]# . test.sh
Hello World!
[root@web01 scripts]# source test.sh
Hello World!
什麼區別?
1 2 在子shell中執行
. source 父進程下執行