shell腳本編程
創(chuàng)新互聯(lián)專注于岢嵐網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供岢嵐?fàn)I銷型網(wǎng)站建設(shè),岢嵐網(wǎng)站制作、岢嵐網(wǎng)頁設(shè)計(jì)、岢嵐網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務(wù),打造岢嵐網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供岢嵐網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
在講shell腳本編程前,先了解一下bash的顏色顯示規(guī)則:
bash的顏色顯示規(guī)則是按照ASCII編碼對(duì)顏色進(jìn)行設(shè)置的;其一些常用的編碼有:
\033:Ctrl鍵;
[:控制顏色屬性命令;
0m:關(guān)閉顏色屬性命令;
1m:加粗顯示文本字符;
4m:為文本字符加下劃線標(biāo)識(shí);
5m:使文本字符閃爍;
7m:將文本字符的背景色和前景色交換顯示;
8m:將文本字符的背景色和前景色設(shè)置為相同顏色;
30m-39m:設(shè)置文本字符的前景色;38m和39m暫時(shí)保留;
40m-49m:設(shè)置文本字符的本景色;48m和49m暫時(shí)保留;
例子:echo -e "\033[5;37mhello world\033[0m" #顯示×××的閃爍的hello world
在Linux中一個(gè)完整的Linux程序,一般包括4類文件:
二進(jìn)制文件(可執(zhí)行文件)、頭和庫文件、幫助文件、配置文件
其中bash--CLI(命令行接口)的一種,屬于完整的應(yīng)用程序,也有這四類文件;
bash的配置文件分為一下三類:
profile類:為交互式登陸的shell進(jìn)程實(shí)現(xiàn)功能出事化的配置文件;
bashrc類:為非交互式登陸的shell進(jìn)程實(shí)現(xiàn)功能配置的文件;
logout類:為交互式登陸的shell進(jìn)程提供終止及清理類功能的配置文件;
shell的類型:
交互式登陸的shell:
1.直接通過某個(gè)終端輸入賬號(hào)和密碼后登陸打開的shell進(jìn)程;
2.使用su - USERNAME 或su - USERNAME 執(zhí)行切換登陸打開的shell進(jìn)程;
非交互式登陸的shell:
1.在圖形界面下,透過菜單或右鍵菜單打開的終端的shell進(jìn)程;
2.使用su USERNAME執(zhí)行切換登陸打開的shell進(jìn)程;
bash的配置文件:
profile類:
全局:對(duì)所有用戶都生效的配置;其目錄為:/etc/profile、/etc/profile.d/*.sh
注意:在RHEL或CentOS系列的操作系統(tǒng)中,通常情況下,如果一個(gè)配置文件內(nèi)容很多,格式復(fù)雜,我們會(huì)將其切割成多個(gè)片段,將切割出來的片段統(tǒng)一的存放在“程序名稱.d”目錄中;在這樣目錄中所保存的片段文件,大多以統(tǒng)一的文件后綴名來命令;
用戶個(gè)人:僅僅只是針對(duì)某個(gè)用戶有效的配置文件;其目錄:~/.bash_profile
profile類配置的文件的作用:
1.用于定義用戶的環(huán)境變量;
2.用于運(yùn)行腳本或執(zhí)行命令;
bashrc類:
全局:/etc/bashrc
用戶個(gè)人:/.bashrc
bashlrc類配置的文件的作用:
1.用戶定義本地變量
2.用戶定義命令的別名;
3.定義umask;
注意:只有超級(jí)用戶root可以修改全局類的配置文件;普通用戶只能修改其家目錄中的個(gè)人配置文件;
交互式登陸的shell進(jìn)程,會(huì)按照順序加載下列配置文件:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登陸的shell進(jìn)程,會(huì)按照順序加載下列配置文件:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
所有在命令行中執(zhí)行的命令的操作,只要沒涉及到文件的修改的,一般都只是針對(duì)當(dāng)前的shell生命周期有效;只要shell進(jìn)程結(jié)束,所有的設(shè)置均失效;
配置文件的作用;使得我們賴以生存的配置信息可以長期有效,只要不修改配置文件中的內(nèi)容,每一次打開shell都會(huì)使曾經(jīng)的配置生效;
讓配置文件中新定義的配置能夠立即生效的方式:
1.source命令:
格式:source /PATH/TO/SOME_CONF_FILES
. /PATH/TO/SOME_CONF_FILES
2.exec命令:
格式:exec /PATH/TO/SIME_CONF_FILES
bash中變量中存放的字符串處理方式:
弱變量:
1.無需事先定義即可使用;
2.沒有變量數(shù)據(jù)類型的硬性要求,默認(rèn)是字符行;
1.字符串切片:
${#VAR}:返回字符串類型的變量VAR的長度;
${VAR:offset}:返回字符串變量VAR中第offset個(gè)字符后面的內(nèi)容,不包括第offset個(gè)字符;offset的取值范圍為:0~$[${#VAR}-1]
${VAR:offset:number}:返回字符串變量VAR中從第offset個(gè)字符后開始,長度為number的字符部分;
${VAR: -length}:取字符串最右測的length個(gè)字符;
2.基于模式取字符串:
${VAR#*PATTERN}:自左而右,查找VAR變量所存儲(chǔ)的字符串中,第一次被PATTERN匹配的字符,刪除從字符串開始到PATTERN匹配的字符之間的所有字符;
${VAR##*PATTERN}:自左而右,查找VAR變量所存儲(chǔ)的字符串中,所有被PATTERN匹配的字符,刪除從字符串開始到最后一個(gè)PATTERN匹配的字符之間的所有字符;
${VAR%PATTERN*}:自右而左,查找VAR變量所存儲(chǔ)的字符串中,第一次被PATTERN匹配的字符,刪除從字符串結(jié)尾到PATTERN匹配的字符之間的所有字符;
${VAR%%PATTERN*}:自右而左,查找VAR變量所存儲(chǔ)的字符串中,第一次被PATTERN匹配的字符,刪除字符串結(jié)尾到最后一個(gè)PATTERN匹配的字符之間的所有字符;
3.查找替換:
${VAR/PATTERN/SUBSTRING}:在VAR變量中查找匹配PATTERN的內(nèi)容,將其第一個(gè)匹配的結(jié)果更換成SUBSTRING;
${VAR//PATTERN/SUBSTRING}:在VAR變量中查找匹配PATTERN的內(nèi)容,將其所有匹配到的結(jié)果都更換成SUBSTRING;
${VAR/#PATTERN/SUBSTRING}:在VAR變量中查找行首匹配PATTERN的內(nèi)容,將匹配的結(jié)果更換成SUBSTRING;
${VAR/%PATTERN/SUBSTRING}:在VAR變量中查找行尾匹配PATTERN的內(nèi)容,將匹配的結(jié)果更換成SUBSTRING;
4.查找刪除:
${VAR/PATTERN}:在VAR變量中查找匹配PATTERN的內(nèi)容,將其第一個(gè)匹配到的結(jié)果刪除;
${VAR//PATTERN}:在VAR變量中查找匹配PATTERN的內(nèi)容,將其所有匹配到的結(jié)果刪除;
${VAR/#PATTERN}:在VAR變量中查找匹配PATTERN的內(nèi)容,將其行首匹配到的結(jié)果刪除;
${VAR/%PATTERN}:在VAR變量中查找匹配PATTERN的內(nèi)容,將其行尾匹配到的結(jié)果刪除;
5.字符的大小寫轉(zhuǎn)換:
${VAR^^}:將VAR變量中的所有小寫字母轉(zhuǎn)換為大寫字母;
${VAR,,}:將VAR變量中的所有大寫字母轉(zhuǎn)換成小寫字母;
6.變量賦值:
${VAR:-value}:如果變量VAR為空或未被設(shè)置,那么直接返回value的值,否則返回變量VAR的值;
${VAR:+value}:如果變量VAR不為空,則返回value;
${VAR:=value}:如果變量VAR為空或?yàn)楸辉O(shè)置,那么直接返回value的值,并且將value的值賦值給變量VAR;否則返回變量VAR的值;
7.變量的間接引用:
如果第一個(gè)變量的值的恰好是第二個(gè)變量的變量名,從第一個(gè)變量引用第二個(gè)變量的值的方法,就稱為變量的間接引用,也稱為間接變量引用;
數(shù)組
在了解數(shù)組前,我們先來聊聊變量,變量就是內(nèi)存的存儲(chǔ)空間。它的特點(diǎn):是每個(gè)變量中只能存放一個(gè)數(shù)據(jù),變量只能進(jìn)行一次性的賦值。但是當(dāng)我們存放本班每個(gè)人的名字與變量時(shí),我們有一下幾種方法:
1.一次性賦值:NAME="name1 name2 name3 ..."
2.使用多個(gè)變量,分別賦值:NAME1=xu、NAME2=shen;
3.數(shù)組變量
數(shù)組:存放一個(gè)或多個(gè)元素的連續(xù)的內(nèi)存空間,相當(dāng)于多個(gè)變量的集合;
數(shù)組元素:數(shù)組中任何一個(gè)存放數(shù)據(jù)的存儲(chǔ)單元;
數(shù)組的索引:
1.數(shù)子:索引數(shù)組(Index ARRAY)
2.名稱(字符串):關(guān)聯(lián)數(shù)組(Related ARRAY) bash5.0以上的版本才支持;
數(shù)組分兩種:
稠密數(shù)組:索引編號(hào)必須連續(xù)
稀疏數(shù)組:索引編號(hào)可以不連續(xù),bash數(shù)組屬于此類;
數(shù)組的聲明方法:
1.declare命令:
declare -i NAME:將NAME聲明為整型變量;
declare -x NAME:將NAME聲明為環(huán)境變量;
declare -a NAME:將NAME聲明為索引數(shù)組;
declare -A NAME:將NAME聲明為關(guān)聯(lián)數(shù)組;
2.直接聲明數(shù)組:
直接為數(shù)組賦值:
ARRAY_NAME=("value1" "value2" "value3" ...) 聲明稠密數(shù)組;
ARRAY_NAME=([0]="value1" [1]="value2" [4]="value3" ...) 聲明稀疏數(shù)組
3.定義數(shù)組的元素而穿件數(shù)組:
ARRAY_NAME[0]=value1
ARRAY_NAME[1]=value2
...
引用數(shù)組中的元素:
引用變量的方法:${NAME}
引用數(shù)組元素的方法:${ARRAY_NAME[INDEX]}
注意:如果不給出INDEX,則表示引用數(shù)組的第一個(gè)元素,即INDEX=0的元素;
引用整個(gè)數(shù)組的所有元素:${ARRAY_NAME[*]}或者${ARRAY_NAME[@]}
引用數(shù)組的索引:${!ARRAY_NAME[*]}或者${!ARRAY_NAME[@]}
查看數(shù)組的長度(數(shù)組中有效元素的個(gè)數(shù))${#ARRAY_NAME[*]}或者${#ARRAY_NAME[@]}
數(shù)組切片:
${ARRAY_NAME:offset}:顯示包括offset數(shù)字所表示的索引位置及以后的所有元素;
${ARRAY_NAME:offset:number}:顯示包括offset數(shù)字所表示的索引位置及以后的number個(gè)元素;
向數(shù)組中追加元素:
1.稠密數(shù)組: ARRAY_NAME[${ARRAY_NAME[*]}]=valueN
2.稀疏數(shù)組:ARRAY_NAME[INDEX]=value 注意:INDEX必須為未被使用的數(shù)組元素索引編號(hào)
撤銷數(shù)組:usnet ARRAY_NAME
刪除數(shù)組中的元素:unset ARRAY_NAME[INDEX]
shell腳本編程
特點(diǎn):過程式編程、腳本類編程、解釋型編程
過程式編程語言:
順序執(zhí)行結(jié)果:
以從左到右,從上到下順序執(zhí)行所有的語句(命令)
shell腳本的主體結(jié)構(gòu);
選擇執(zhí)行結(jié)構(gòu):
依照給定條件的邏輯判斷結(jié)果或者依照可選的取值范圍,進(jìn)而選擇某個(gè)分支中的語句倆執(zhí)行;
if:分支選擇標(biāo)準(zhǔn),邏輯判斷的結(jié)果;
case:分支選擇標(biāo)準(zhǔn),根據(jù)可選的取值;
循環(huán)執(zhí)行結(jié)構(gòu):
對(duì)于某特定語句,重復(fù)執(zhí)行0次,1次或多次;
for:遍歷指定的列表;
while:根據(jù)邏輯判斷的結(jié)果;
until:根據(jù)邏輯判斷的結(jié)果;
select:死循環(huán),利用循環(huán)機(jī)制提供選擇列表;
選擇執(zhí)行結(jié)構(gòu):
if語句:if 命令;then 命令;[elif 命令;then 命令;]... [else 命令 ;] fi
if語句單分支結(jié)構(gòu):如果條件為真,則執(zhí)行then后的命令,否則,不做任何操作;
格式:
if CONDITOIN then STATEMET fi if CONDITION ; then STATEMENT1 STATEMENT2 ... fi
注意:想要執(zhí)行then后面的STATEMENTS,前提條件是CONDITION部分為真;
if語句的雙分支結(jié)構(gòu):如果條件為真,就執(zhí)行then后面的命令,否則就執(zhí)行else后面的命令;
if CONDITION ; then STATEMENT ... else STATEMENT ... fi
if語句的多分支結(jié)構(gòu):首先判斷CONDITION1是否為真,如果為真,則執(zhí)行第一個(gè)then后面的語句;否則就判斷CONDITION2是否為真,如果為真,就執(zhí)行第二個(gè)then后面的語句;否則就判斷CONDITION3是否為真,如果為真,就執(zhí)行第三個(gè)then后面的語句...如果所有的CONDITION都為假,就執(zhí)行else后面的語句;
if CONDITION1 ;then STATEMENT ... elif CONDITION2 ; then STATEMENT ... elif CONDITION3 ; then STATEMENT ... ... else STATEMENT ... fi
建議:if多分支結(jié)構(gòu),能不用就不用
循環(huán)執(zhí)行結(jié)構(gòu):
將一段代碼重復(fù)的執(zhí)行0次,1次或多次;
一個(gè)好的循環(huán)結(jié)構(gòu),必須要包括連個(gè)重要的環(huán)節(jié):
進(jìn)入循環(huán)的條件:
開始循環(huán)時(shí)所滿足的條件;
退出循環(huán)的條件:
循環(huán)結(jié)束所滿足的條件;
for循環(huán):
1.遍歷列表
for VAR_NAME in LIST ; do 循環(huán)體; done for VAR_NAME in LIST ; do 循環(huán)體 done
VAR_NAME:任意指定的變量名稱,變量的值是從LIST中取值并賦值的;
循環(huán)體:一般來說是能夠用到VAR_NAME的命令或命令的組合;如果循環(huán)體中沒有包括VAR_NAME,則可能出現(xiàn)死循環(huán);
LIST的生成方式 :
1)直接給出
2)純整數(shù)列表
3)花括號(hào)展開
4)命令的執(zhí)行結(jié)果的返回值
5)GLOBBING
6)某些變量的引用:$@, $*
2.控制變量
for ((表達(dá)式1; 表達(dá)式2; 表達(dá)式3 ));do 命令;done for ((表達(dá)式1; 表達(dá)式2; 表達(dá)式3 ));do 循環(huán)體 done
表達(dá)式1:為變量賦初始值
表達(dá)式2:循環(huán)的退出條件
表達(dá)式3:變量值的變化規(guī)律
文章題目:我的朗科運(yùn)維第七課
文章出自:http://bm7419.com/article26/pcgccg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、云服務(wù)器、微信公眾號(hào)、定制開發(fā)、網(wǎng)站維護(hù)、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)