我的朗科運(yùn)維第七課

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)

成都定制網(wǎng)站建設(shè)