? ? Shell概述
Shell是一種具備特殊功能的程序,它提供了用戶與內(nèi)核進行交互操作的一種接口。它接收用戶輸入的命令,并把它送入內(nèi)核去執(zhí)行。內(nèi)核是Linux系統(tǒng)的心臟,從開機自檢就駐留在計算機的內(nèi)存中,直到計算機關(guān)閉為止,而用戶的應(yīng)用程序存儲在計算機的硬盤上,僅當(dāng)需要時才被調(diào)入內(nèi)存。Shell是一種應(yīng)用程序,當(dāng)用戶登錄Linux系統(tǒng)時,Shell就會被調(diào)入內(nèi)存去執(zhí)行。Shell獨立于內(nèi)核,它是連接內(nèi)核和應(yīng)用程序的橋梁,并由輸入設(shè)備讀取命令,再將其轉(zhuǎn)為計算機可以理解的機械碼,Linux內(nèi)核才能執(zhí)行該命令。
優(yōu)勢
Shell腳本語言的好處是簡單、易學(xué)、易用,適合處理文件和目錄之類的對象,以簡單的方式快速完成某些復(fù)雜的事情通常是創(chuàng)建腳本的重要原則,腳本語言的特性可以總結(jié)為以下幾個方面:
語法和結(jié)構(gòu)通常比較簡單。
學(xué)習(xí)和使用通常比較簡單,
通常以容易修改程序的“解釋”作為運行方式,而不需要“編譯。
程序的開發(fā)產(chǎn)能優(yōu)于運行效能。
Shell腳本語言是Linux/Unix系統(tǒng)上一種重要的腳本語言,在Linux/Unix領(lǐng)域應(yīng)用極為廣泛,熟練掌握Shell腳本語言是一個優(yōu)秀的Linux/Unix開發(fā)者和系統(tǒng)管理員必經(jīng)之路。利用Shell腳本語言可以簡潔地實現(xiàn)復(fù)雜的操作,而且Shell腳本程序往往可以在不同版本的Linux/Unix系統(tǒng)上通用。
Shell編程
基本格式
Shell腳本的文件名后綴通常是.sh (當(dāng)然你也可以使用其他后綴或者沒有后綴,.sh是為了規(guī)范)
程序編寫格式:
?。?a href="http://www.brongaenegriffin.com/v/tag/852/" target="_blank">java] view plain copy#!/bin/bash
# 注釋使用#號
代碼示例:
[java] view plain copy//使用vi編輯器編寫shell腳本(a.sh不存在則會新建)
vi a.sh
進入vi編輯模式后編寫執(zhí)行代碼
?。踛ava] view plain copy//固定格式,記住就可以了
#!/bin/bash
//執(zhí)行的代碼
echo Hello World
賦予權(quán)限并執(zhí)行:
?。踛ava] view plain copy//賦予可執(zhí)行權(quán)限
chmod +x a.sh
//執(zhí)行(調(diào)用/bin/bash執(zhí)行a.sh腳本)
。/a.sh
執(zhí)行結(jié)果:
下面是幾種運行情況:
?。踛ava] view plain copya.sh
這樣的話需要保證腳本具有執(zhí)行權(quán)限并且在環(huán)境變量PATH中有(。),這樣在執(zhí)行的時候會先從當(dāng)前目錄查找。
[java] view plain copy./a.sh
只要保證這個腳本具有執(zhí)行權(quán)限即可
?。踛ava] view plain copy/usr/local/a.sh
只要保證這個腳本具有執(zhí)行權(quán)限即可
[java] view plain copybash a.sh
直接可以執(zhí)行,甚至這個腳本文件中的第一行都可以不引入/bin/bash,它是將hello.sh作為參數(shù)傳給bash命令來執(zhí)行的。
?。踛ava] view plain copybash -x /path/to/aa.sh
bash的單步執(zhí)行
?。踛ava] view plain copybash -n /path/to/aa.sh
bash語法檢查
變量
變量不需要聲明,初始化不需要指定類型
變量命名
1、只能使用數(shù)字,字母和下劃線,且不能以數(shù)字開頭
2、變量名區(qū)分大小寫
3、建議命令要通俗易懂
注意:變量賦值是通過等號(=)進行賦值,在變量、等號和值之間不能出現(xiàn)空格。
顯示變量值使用echo命令(類似于java中的system.out) ,加上$變量名,也可以使用${變量名}
例如:
?。踛ava] view plain copyecho $JAVA_HOME
echo ${JAVA_HOME}
變量的申明和使用:
變量分類:
Shell變量有這幾類:本地變量、環(huán)境變量、局部變量、位置變量、特殊變量。
本地變量:
只對當(dāng)前shell進程有效的,對當(dāng)前進程的子進程和其它shell進程無效。
定義:VAR_NAME=VALUE
變量引用:${VAR_NAME} 或者 $VAR_NAME
取消變量:unset VAR_NAME
相當(dāng)于java中的私有變量(private),只能當(dāng)前類使用,子類和其他類都無法使用。
比如在一個bash命令窗口下再使用bash,則變成了子進程,本地變量不會被這個子進程所訪問。
環(huán)境變量:
自定義的環(huán)境變量對當(dāng)前shell進程及其子shell進程有效,對其它的shell進程無效
定義:export VAR_NAME=VALUE
對所有shell進程都有效需要配置到配置文件中
?。踛ava] view plain copyvi /etc/profile
source /etc/profile
相當(dāng)于java中的protected修飾符,對當(dāng)前類,子孫類,以及同一個包下面可以共用。
和windows中的環(huán)境變量比較類似
自定義的環(huán)境變量:
局部變量:
在函數(shù)中調(diào)用,函數(shù)執(zhí)行結(jié)束,變量就會消失
對shell腳本中某代碼片段有效
定義:local VAR_NAME=VALUE
相當(dāng)于java代碼中某一個方法中定義的局部變量,只對這個方法有效。
位置變量:
比如腳本中的參數(shù):
$0:腳本自身
$1:腳本的第一個參數(shù)
$2:腳本的第二個參數(shù)
相當(dāng)于java中main函數(shù)中的args參數(shù),可以獲取外部參數(shù)。
特殊變量:
$?:接收上一條命令的返回狀態(tài)碼
返回狀態(tài)碼在0-255之間
$#:參數(shù)個數(shù)
$*:或者$@:所有的參數(shù)
$$:獲取當(dāng)前shell的進程號(PID)(可以實現(xiàn)腳本自殺)(或者使用exit命令直接退出也可以使用exit [num])
引號
Shell編程中有三類引號:單引號、雙引號、反引號。
‘’單引號不解析變量
?。踛ava] view plain copyecho ‘$name’
“”雙引號會解析變量
[java] view plain copyecho “$name”
``反引號是執(zhí)行并引用一個命令的執(zhí)行結(jié)果,類似于$(。。。)
[java] view plain copyecho `$name`
示例:
評論