安裝腳本中的shell基本知識點總結
本文講述了在Install.sh腳本中出現的shell相關語法,這可以幫助無shell編程基礎的人員掃清語法障礙,快速理解腳本的意圖。
1.??????? “#!” 是一個約定的標記,它告訴系統這個腳本需要什么解釋器來執行,即使用哪一種Shell。Shell腳本解釋器的種類有bash、sh、csh、ksh等,bash是Linux標準默認的shell。
2.??????? main函數為腳本的主函數,腳本執行的入口
3.??????? if ... fi語句:
如果[]內的表達式返回true,then后邊的語句將會被執行;如果返回false,不會執行任何語句。最后必須用fi結尾來閉合if。
4.??????? 命令替換
$(id -u):$(cmd)的意思是將cmd執行一次,并用標準輸出替換$(cmd)。其等價于`cmd`,即用反引號包含命令,反引號是鍵盤上Esc下面的符號。
5.??????? 條件測試—整數測試
if ?[ $(id -u) -ne 0 ]:條件表達式要放在方括號中,并且[]和表達式之間要有空格,否則會有語法錯誤。[為一個shell命令,其語法為:[ expression ]
方括號也可以用test命令代替,test命令的語法為:test expression
其中 –ne 為關系運算符,用于檢測兩個數是否相等。
表1:整數運算符列表
運算符
說明
舉例
-eq
檢測兩個數是否相等,相等返回 true。
[ $a -eq $b ] 返回?true。
-ne
檢測兩個數是否相等,不相等返回 true。
[ $a -ne $b ] 返回 true。
-gt
檢測左邊的數是否大于右邊的,如果是,則返回 true。
[ $a -gt $b ] 返回 false。
-lt
檢測左邊的數是否小于右邊的,如果是,則返回 true。
[ $a -lt $b ] 返回 true。
-ge
檢測左邊的數是否大等于右邊的,如果是,則返回 true。
[ $a -ge $b ] 返回 false。
-le
檢測左邊的數是否小于等于右邊的,如果是,則返回 true。
[ $a -le $b ] 返回 true。
6.??????? 變量的使用
${INS_DEBUG_ERROR}:使用一個定義過的變量,只要在變量名前面加美元符號$即可,變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界。推薦給所有變量加上花括號,這是個好的編程習慣。
7.??????? 函數定義和調用
check_input_param是腳本里定義的一個函數,定義函數的一般格式如下:
function_name () {
list of commands
[ return value ]
}
函數返回值,可以顯式增加return語句;如果不加,會將最后一條命令運行結果作為返回值。
Shell 函數返回值只能是整數(0~255),一般用來表示函數執行成功與否,0表示成功,其他值表示失敗。如果 return 其他數據,比如一個字符串,往往會得到錯誤提示:“numeric argument required”。
如果一定要讓函數返回字符串,那么可以先定義一個變量,用來接收函數的計算結果,腳本在需要的時候訪問這個變量來獲得函數返回值,通過echo語句將數據返回。
調用函數時只需要給出函數名,不需要加括號。當用戶定義一個函數后,實際上該函數就成為一個合法的shell命令。在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,
8.??????? 特殊變量
retVal=$?:其中$?為特殊變量(又稱系統變量),此處代表上個函數check_input_param的返回狀態,0代表成功,非0代表失敗。
表2:特殊變量列表
變量
含義
$0
當前腳本的文件名
$n
傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。當n>=10時,需要使用${n}來獲取參數。
$#
傳遞給腳本或函數的參數個數。
$*
傳遞給腳本或函數的所有參數。
$@
傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。
$?
上個命令的退出狀態,或函數的返回值。
$$
當前Shell進程ID。對于 Shell 腳本,就是這些腳本所在的進程ID。
$!
Shell最后運行的后臺Process的PID
9.??????? 條件測試—字符串測試
if中的[ —字母 ]代表的意思:
[ -z STRING ] “STRING” 的長度為零則為真
String1 = string2 等于,如:if [ "$a" = "$b" ]
String1 != sring2 不等于,如:if [ "$a" == "$b" ],與=等價
[ -d FILE ] 如果FILE存在且是一個目錄則為真。
10.?? >和>>都是重定向輸出,>會覆蓋已有的文件內容,而>>會附加到已有內容之后。
1> 指標準信息輸出路徑(也就是默認的輸出方式)
2> 指錯誤信息輸出路徑
2>&1 指將標準信息輸出路徑指定為錯誤信息輸出路徑(也就是都輸出在一起)
如果希望執行某個命令,但又不希望在屏幕上顯示輸出結果,那么可以將輸出重定向到 /dev/null,如果這樣寫command > /dev/null 2>&1,即代表屏蔽 stdout 和 stderr
11.??? Here Document:目前沒有統一的翻譯,這里暫譯為”嵌入文檔“。Here Document是Shell中的一種特殊的重定向方式,它的基本的形式如下:
command << delimiter
document
delimiter
它的作用是將兩個delimiter之間的內容(document)作為輸入傳遞給command。結尾的delimiter 一定要頂格寫。
12.??? 變量作用域
全局變量:
在腳本中定義的變量為全局變量,作用域為被定義的地方開始到腳本結束或被顯示地刪除處為止。函數體內部的變量默認也是全局變量,其作用域為“函數被調用時執行變量定義的地方”開始,到shell結束或被顯示刪除處為止。
局部變量:
關鍵字為local,如果變量被定義為local,其作用域變為函數體內。另外,函數的參數也是局部變量。
當局部變量和全部變量同名時,函數內部的局部變量會優先被使用。
環境變量:一般是指在操作系統中用來指定操作系統運行環境的一些參數,是所有shell程序都可以使用的變量。常用的有PATH、HOME、TMOUT、PWD等等。按照慣例,shell中的環境變量都使用大寫字母表示。
上圖中PWD就是一個環境變量,用于記錄當前工作目錄。
export:設置新的環境變量。例如$ export TEST="Test..." #增加一個環境變量TEST
env:顯示所有環境變量。
13.??? 引用
單引號:
可以說是所見即所得:即將單引號內的內容原樣輸出,或者描述為單引號里面看到的是什么就會輸出什么。
雙引號:
把雙引號內的內容輸出出來;如果內容中有命令、變量等,會先把變量、命令解析出結果,然后在輸出最終內容來。
不加引號:
如果內容中有命令、變量等,會先把變量、命令解析出結果,然后在輸出最終內容來;如果字符串中帶有空格等特殊字符,則不能完整的輸出,需要改加雙引號。一般連續的字符串,數字,路徑等可以用。
在echo命令中,雙引號可有可無,單引號主要用于原樣輸出
軟件開發
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。