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