shell腳本編程進階

前言:進入正題之前我們先來複習一下有關腳本編程的條件測試

條件1.png

條件2.png

一,流程控制

  1. 過程式編程語言

    a.順序執行

    b.選擇執行

    c.循環執行

  2. 順序執行

    顧名思義,就是按照你腳本里所敲的內容順序執行

  3. 選擇執行

    fi

    a.條件選擇if語句,可以嵌套

    b.格式

    單支

    if 判斷條件;then

              條件爲真

    fi

    雙分支

    if 判斷條件;then

              條件爲真

    else

              條件爲假

    fi

    多分支

    if 判斷條件;then

             條件爲真

    elif(相當於else if) 判斷條件;then

             條件爲真

    else

             上述條件都爲假

    fi

    逐條進行判斷,第一次遇到真條件時,執行分支,然後fi結束整個if語句


    看幾個例子,瞭解一下具體在腳本里格式是什麼樣的

    if.png

    if1.png

    所有的腳本寫完之後的操作都一樣,就在這裏演示一次後面就都不演示了


    case

    a.case支持glob風格的通配符

    *任意長度任意字符
    ?任意單個字符
    [ ]指定範圍內的任意單個字符
    a|ba或者b

    b.格式

    case 變量引用 in

            pat1) 分支;;

            pat2) 分支;;

            ...

            *) 分支;;

    esac


    case.png


  4. 循環執行

    定義:將某代碼段重複運行多次,有進入條件和退出條件

    for

    a.格式

    for 變量名 in 賦值列表;do

          循環體

    done

    b.執行機制:依次將列表的元素賦值給變量名,每次賦值後執行一次循環體,知道列表中耗盡,循環結束

    c.列表生成方式

       (1)直接給出列表 {1,2,3}

       (2)整數列表

                (a){1..10}

                (b)$(seq 1 10)

        (3)返回列表的命令 $(cmd)

        (4)變量引用 $@,$#


    for.png


    for1.png


    while

    a.格式

    while 循環控制條件;do

              循環體

    done

    $R9LH7MB.png

    b.循環控制條件是true,進入循環,否則退出循環

    c.特殊用法   遍歷文件的每一行

    while read line;do

              循環體

    done < 文件名

    依次讀取文件的每一行,並且賦值給$line


    readline.png



    until

    a.格式

    until 循環控制條件;do

            循環體

    done

    b.循環控制條件是false,進入循環,否則退出循環


    until.png



    continue

    用於循環體中,提前結束第N層的本輪循環,進入下一輪N+1層循環

    break

    用於循環體中,提前結束第N層本輪循環


    這倆個是在其他循環語句中應用,在其他示例的圖片裏一起講了 



    shift

    shift n

    用於參量列表,左移指定次數,不指定爲左移一次;一旦被移動,最左端的參數從列表中刪除


    shift.png



    select        用於創建菜單

    a.格式

    select variable in list;do

             循環體命令

    done

    b.PS3提示符

    c.輸入菜單的某個數字,執行相應的命令,是無線循環,需用break退出循環或者exit終止腳本


    menu.png


    menu1.png



  5. 特殊用法

    ((...)) 可以用於運算

    for ((變量初始化;條件判斷表達式;控制變量的修正表達式));do

           循環體

    done

    每輪循環結束會先進行控制變量修正運算,然後再做條件判斷


    (()).png



二,函數

  1. 函數介紹

    不是單獨的進程,不能獨立運行,是shell程序的一部分,在當前shell中運行

  2. 定義函數

    a.方式一

    函數名 () { 函數體;}    常用

    b.方式二

    function 函數名 { 函數體;}

    c.方式三

    function 函數名 () { 函數體;}

  3. 函數使用

    a.可在交互式環境下定義函數

    b.可將函數放在腳本文件中作爲它的一部分

    c.可放在只包含函數的單獨文件

    d.函數只有被調用纔會執行

  4. 函數返回值

    return 從函數中返回,用最後狀態命令決定返回值,是0,則是無錯誤返回;是1-255,則是有錯誤返回

  5. 定義及使用函數

    a.交互式環境

    定義函數後,將一直保留到用戶從系統退出,或者執行unset   刪除函數,取消函數賦值

    b.腳本中

    調用函數直接調用函數名即可

    調用函數.png

  6. 載入函數

    函數文件創建好後,用 . 或者source 接上文件名載入函數

  7. 執行shell函數

    直接輸入函數名即可

  8. 函數參數

    可以接受調用$1,$2,...這些參數,還有特殊變量

    $@,$*  表示所有的參數

    $#  表示參數個數

  9. 函數變量

    a.環境變量

    當前shell和子shell有效

    b.本地變量

    只在當前函數運行期間有效

    c.全局函數

    對當前shell有效

  10. 函數遞歸

    函數直接或間接調用自身


    調用函數.png


    函數文件.png



三,數組

  1. 相關數組的含義

    a.變量

    存儲單個元素的內存空間

    b.數組

    存儲多個元素的連續的內存空間,相當於多個變量的集合

    c.索引

    從0開始,數值索引,declare -a 數組名  聲明數字索引

    也可以自定義,爲關聯索引,declare -A 數組名  聲明關聯索引

  2. 數組賦值

    a.一次賦值一個元素

    title[1]=a

    b.一次賦值全部元素

    title=(a b c )    下標自動從0開始排

    c.指定下標數

    title=([0]=a [3]=b)

    d.交互式賦值

    read -a 數組名

    數組read.png

  3. 引用數組

    a.引用數組元素

    ${數組名[下標數]}

    b.引用數組所有元素

    ${數組名[@|*]}

    c.數組元素的個數

    ${#數組名[@|*]}

    c.刪除數組或者元素

    unset 數組名[下標值]

  4. 數組數據處理

    a.引用數組中元素

    ${數組名[@] :i:j}

    i:爲正數時是從左往右跳過i個元素;爲負數時是從右往左取出i個元素

    j:爲正數時是從左往右取出j個元素;爲負數時是從右往左去掉j個元素



    數組引用.png



    b.追加元素

    數組名[${#數組名[@]}]=元素值

    c.關聯數組

    關聯數組必須先聲明再調用

    d.顯示字符串長度

    ${#數組名}

    字符.png



四,高級字符串操作

  1. 基於模式取字符串

    ${數組名#*字符串}   從左往右開始刪除直到第一次出現匹配到字符串的所有字符

    ${數組名##*字符串}    從左往右開始刪除直到最後一次出現匹配到字符串的所有字符

    ${數組名%字符串*}    跟#用法一樣,但是是從右往左開始


    數組字符串刪除.png



  2. 查找替換

    ${數組名/匹配的字符串/替換的字符串}  第一次被匹配到的字符串,替換

    ${數組名//匹配的字符串/替換的字符串}   所有被匹配的字符串,替換

    ${數組名/#匹配的字符串/替換的字符串}    行首被匹配的字符串,替換

    ${數組名/%匹配的字符串/替換的字符串}    行尾被匹配的字符串,替換


    數組查找替換.png



  3. 查找刪除

    與替換用法一樣,不輸入替換的字符串即可

  4. 字符大小寫轉換

    ${數組名^^}   把數組中的所有小寫字母換成大寫

    ${數組名,,}   把數組中的所有大寫字母換成小寫


    數組腳本.png

    數組腳本結果.png

    數組關聯腳本.png



五,高級變量

  1. declare

    有類型變量

    declare.png

    如果declare -a 和 declare -A 後面沒有接變量名則表示顯示索引數組和關聯數組

  2. eval

    會先掃描所有的置換,然後執行命令;適用於一次掃描無法實現的變量;對變量進行倆次掃描

    eval.png

  3. mktemp

    創建並顯示臨時文件,可避免衝突

    mktemp.png

  4. install

    安裝複製文件

    install.png

  5. expect

    a.介紹

    主要應用於自動化交互操作的場景,就是把交互式操作成自動完成

    expect.png





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章