1. 背景
Shell的作用是解釋執行使用者的指令,使用者輸入一條指令,Shell就解釋執行一條,這種方式稱為互動式(Interactive),Shell還有一種執行指令的方式稱為批處理(Batch),使用者事先寫一個Shell腳本(Script),其中有很多條指令,讓Shell一次把這些指令執行完,而不必一條一條地敲指令。Shell腳本和程式設計語言很相似,也有變量和流程控制語句,但Shell腳本是解釋執行的,不需要編譯,Shell程式從腳本中一行一行讀取并執行這些指令,相當于一個使用者把腳本中的指令一行一行敲到Shell提示符下執行。
2. 分類與曆史[由于曆史原因,UNIX系統上有很多種Shell]
sh(Bourne Shell):由Steve Bourne開發,各種UNIX系統都配有sh。
csh(C Shell):由Bill Joy開發,随BSD UNIX釋出,它的流程控制語句很像C語言,支援很多Bourne Shell所不支援的功能:作業控制,指令曆史,指令行編輯。
ksh(Korn Shell):由David Korn開發,向後相容sh的功能,并且添加了csh引入的新功能,是目前很多UNIX系統标準配置的Shell,在這些系統上/bin/sh往往是指向/bin/ksh的符号連結。
tcsh(TENEX C Shell):是csh的增強版本,引入了指令補全等功能,在FreeBSD、MacOS X等系統上替代了csh。
bash(Bourne Again Shell):由GNU開發的Shell,主要目标是與POSIX标準保持一緻,同時兼顧對sh的相容,bash從csh和ksh借鑒了很多功能,是各種Linux發行版标準配置的Shell,在Linux系統上/bin/sh往往是指向/bin/bash的符号連結。雖然如此,bash和sh還是有很多不同的,一方面,bash擴充了一些指令和參數,另一方面,bash并不完全和sh相容,有些行為并不一緻,是以bash需要模拟sh的行為:當我們通過sh這個程式名啟動bash時,bash可以假裝自己是sh,不認擴充的指令,并且行為與sh保持一緻。
3. 編寫第一個腳本: [1.sh]
<code>#! /bin/bash #指定指令解釋器shell</code>
<code> </code><code>cd</code> <code>.. </code><code>#切換到上一級目錄</code>
<code> </code><code>ls</code> <code>#顯示目前目錄下所有檔案</code>
# 表示注釋, 解釋器不解釋注釋後面的内容
#! 必須位于開頭, 稱為(Shebang), 它表示該腳本使用後面的指定解釋器/bin/bash解釋執行
4. 執行shell腳本方法
給該腳本回執行權限 如: chmod a+x 1.sh 然後直接可執行
通過 . 1.sh 執行
通過 source 1.sh 執行
通過指定sh執行 如: /bin/bash 1.sh 或 /bin/bin 1.sh
5. 基本文法
變量分類
環境變量: 環境變量由父程序傳給子程序, 指目前系統的env環境變量
本地變量: 在腳本内定義的變量我們統稱為本地變量,如 sea="hello wolrd!"
内置變量
$? 上一次指令執行結果
$$ 目前程序pid
$0 目前腳本檔案名
$[1-n] 腳本參數
$@ 所有參加清單
$* 同上
$# 參數的個數
變量:
字元統配符
指令展開
`指令` 展開指令 如 sea=`ls` 此時sea儲存的是目前目錄下所有的檔案清單
$(指令)如上
轉義字元
* 比對0個或多個任意字元
? 比對一個任意字元
[若幹字元] 比對括号内任意一個字元并出現一次
變量使用:
變量名定義 變量名=變量值 (等号兩邊不能有空格) 如 sea="hello world!"
$變量名: 取變量的值 如sea="hello world!" echo $sea 輸出結果hello world!
删除已定義的變量: unset 變量名 如 unset sea
算術:
數算判斷符
-eq 等于
-ne 不等于
-gt 大于
-ge 大于或等于
-lt 小于
-le 小于或等于
送件判斷符
-d 判斷檔案是否是目錄
-f 判斷檔案是否是普通檔案
-p 判斷檔案是否是管道檔案
-r 判斷檔案是否有讀權限
-w 判斷檔案是否有寫權限
-x 判斷檔案是否有執行權限
-z 如果檔案長度為0, 則傳回0(真)
-n 如果檔案長度為非0, 則傳回0(真)
-a 與 如[ -p pipe -a $var2 = "sadsa" ] pipe是管道并且字元串相等
-o 或 如[ -p pipe -a $var2 = "sadsa" ] pipe是管道或者字元串相等
\ 用于去除後面的單個字元的特殊意義(回車除外)
簡單的輸出語句腳本:
<code>#! /bin/sh</code>
<code>#print hello world #注釋</code>
<code>#authors sea 2016/06/24 </code>
<code>/bin/echo</code> <code>"hello world!"</code> <code>#列印hello world</code>
<code>/bin/pwd</code> <code>#輸出目前路徑</code>
<code>/bin/ls</code> <code>#輸出目前目錄下所有檔案</code>
<code>/bin/ls</code> <code>| </code><code>wc</code> <code>#統計目前目錄下所有檔案</code>
<code>/bin/echo</code> <code>"sea"</code> <code>#輸出sea</code>
<code>/bin/ps</code> <code>aux </code><code>#輸出目前程序詳細情況</code>
提示: 從程式員的角度來看, Shell本身是一種用C語言編寫的程式,從使用者的角度來看,Shell是使用者與Linux作業系統溝通的橋梁。使用者既可以輸入指令執行,又可以利用 Shell腳本程式設計,完成更加複雜的操作。在Linux GUI日益完善的今天,在系統管理等領域,Shell程式設計仍然起着不可忽視的作用。深入地了解和熟練地掌握Shell程式設計,是每一個Linux使用者的必修 功課之一。
本文轉自asd1123509133 51CTO部落格,原文連結:http://blog.51cto.com/lisea/1792761,如需轉載請自行聯系原作者