1. 程式人生 > >shell腳本編程進階

shell腳本編程進階

腳本語句 數組 函數 install declare

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

技術分享圖片

技術分享圖片

一,流程控制

  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語句


    看幾個例子,了解一下具體在腳本裏格式是什麽樣的

    技術分享圖片

    技術分享圖片

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


    case

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

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

    b.格式

    case 變量引用 in

    pat1) 分支;;

    pat2) 分支;;

    ...

    *) 分支;;

    esac


    技術分享圖片


  4. 循環執行

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

    for

    a.格式

    for 變量名 in 賦值列表;do

    循環體

    done

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

    c.列表生成方式

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

    (2)整數列表

    (a){1..10}

    (b)$(seq 1 10)

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

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


    技術分享圖片


    技術分享圖片


    while

    a.格式

    while 循環控制條件;do

    循環體

    done

    技術分享圖片

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

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

    while read line;do

    循環體

    done < 文件名

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


    技術分享圖片



    until

    a.格式

    until 循環控制條件;do

    循環體

    done

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


    技術分享圖片



    continue

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

    break

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


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



    shift

    shift n

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


    技術分享圖片



    select 用於創建菜單

    a.格式

    select variable in list;do

    循環體命令

    done

    b.PS3提示符

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


    技術分享圖片


    技術分享圖片



  5. 特殊用法

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

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

    循環體

    done

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


    技術分享圖片



二,函數

  1. 函數介紹

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

  2. 定義函數

    a.方式一

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

    b.方式二

    function 函數名 { 函數體;}

    c.方式三

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

  3. 函數使用

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

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

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

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

  4. 函數返回值

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

  5. 定義及使用函數

    a.交互式環境

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

    b.腳本中

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

    技術分享圖片

  6. 載入函數

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

  7. 執行shell函數

    直接輸入函數名即可

  8. 函數參數

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

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

    $# 表示參數個數

  9. 函數變量

    a.環境變量

    當前shell和子shell有效

    b.本地變量

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

    c.全局函數

    對當前shell有效

  10. 函數遞歸

    函數直接或間接調用自身


    技術分享圖片


    技術分享圖片



三,數組

  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 數組名

    技術分享圖片

  3. 引用數組

    a.引用數組元素

    ${數組名[下標數]}

    b.引用數組所有元素

    ${數組名[@|*]}

    c.數組元素的個數

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

    c.刪除數組或者元素

    unset 數組名[下標值]

  4. 數組數據處理

    a.引用數組中元素

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

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

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



    技術分享圖片



    b.追加元素

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

    c.關聯數組

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

    d.顯示字符串長度

    ${#數組名}

    技術分享圖片



四,高級字符串操作

  1. 基於模式取字符串

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

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

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


    技術分享圖片



  2. 查找替換

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

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

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

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


    技術分享圖片



  3. 查找刪除

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

  4. 字符大小寫轉換

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

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


    技術分享圖片

    技術分享圖片

    技術分享圖片



五,高級變量

  1. declare

    有類型變量

    技術分享圖片

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

  2. eval

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

    技術分享圖片

  3. mktemp

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

    技術分享圖片

  4. install

    安裝復制文件

    技術分享圖片

  5. expect

    a.介紹

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

    技術分享圖片





shell腳本編程進階