shell腳本進階

1.流程控制

shell腳本是一種過程式的編程語言,過程式的編程語言主要分爲三種執行方式,分別是順序執行,選擇執行,循環執行,這三種執行方式構建了我們shell腳本的所有內容,我們將依次介紹這三種執行方式。
1.順序執行
shell腳本中所有命令都是順序執行的,即使是選擇和循環也是順序執行的,所以不用特別介紹。
2.選擇執行
選擇執行就是當滿足某些特定的條件後,纔會執行選擇中的語句,選擇執行,主要是兩種選擇方式,分別是if選擇執行和case選擇執行。
if選擇執行:
if支持多層if的嵌套,可以實現多層的選擇執行,例如一個簡單的if語句:

#!/bin/bash
if [ $1 -ge 0 ];then
                if [ $1 lt 9 ];then
                                echo 這是一個大於等於0並且小於9的數
                fi
fi

執行結果如下:
shell腳本進階
如上,if是if選擇的開始,後面是選擇條件,然後是;then是固定語法,後面的內容就是當選擇條件爲真時要執行的語句,fi是選擇結束的標誌。
當然有些時候會有多種選擇,我們可以用elif和else來進行其他的選擇,例如一個簡單的多個選擇:

#!/bin/bash
if[ $1 -eq 0 ];then
                echo 等於0
elif[ $1 -eq 1 ];then
                echo 等於1
else
                echo 非零且非1
fi

我們執行這個腳本,執行結果如下:
shell腳本進階
if選擇執行時,每次只能匹配一個選擇分支,如果沒有匹配的分支,則不執行,直接退出選擇。
case選擇執行:
case是另一種選擇結構,他對於多條並列的選擇分支時,比起if選擇結構就簡單的多了,case選擇也是單一匹配的。我們來看一個簡單的case選擇:

#!/bin/bash
case $1 in 
                1)echo 輸入的是1;;
                2)echo 輸入的是2;;
                3)echo 輸入的是3;;
                4)echo 輸入的是4;;
esac

執行結果如下:
shell腳本進階
case選擇在這種並列情況下是非常方便的,case代表選擇結構開始,然後接的是判斷條件,esac是選擇結構結束的標誌。
3.循環結構
循環結構就是在滿足一些條件時,讓某些語句循環執行,直到不滿足特定條件時結束循環,循環結構主要有以下幾種:
for循環
for循環當循環條件爲真時循環,當條件爲假時結束循環,例如一個簡單的for循環:

#!/bin/bash
for i in `seq 1 3`;do
                echo $i
                echo 第$i次循環
done

執行結果如下:
shell腳本進階
for循環中for代表循環開始,後面跟的是循環條件,然後中間是循環體,以do開始,done結束。
另一種for循環是將循環條件用(())括起來,中間有三個條件,用;隔開,例如

for ((i=0;i<10;i++));do
                echo $i
                echo 本次是第$i次循環
done

執行結果如下:
shell腳本進階
不管哪種循環都能方便進行循環運算,可以看情況選擇合適的for循環
while循環
while循環是一種當條件爲真時進行循環的循環結構,我們可以看一個簡單的while循環:

#!/bin/bash
i=0
while [ $i -lt 5 ];do
                echo $i
                echo 這是第$i次循環
                let i++
done

執行結果如下:
shell腳本進階
在while循環中while是循環開始的標誌,後面接判斷條件,如果爲真,則開始循環,如果爲假,則結束循環,do與done是循環體。
until循環
until循環和while循環相反,他是當條件爲假時進入循環,當條件爲真時結束循環,我們看一下下面這個例子:

#!/bin/bash
i=0
until [ $i -eq 5 ];do
                echo $i
                echo 這是第$i次循環
                let i++
done

執行結果如下:
shell腳本進階
在until循環中until是循環開始的標誌,後面跟循環條件,如果條件爲假,則進入循環,如果條件爲真,則結束循環,do和done之間是循環體。
select循環
select能夠列出循環內容,他需要一個輸入值,並保存在REPLY中,例如

#!/bin/bash
PS3='輸入季節:'
select jijie in "春"     "夏"   " 秋"    "冬"    "退出";do
        case $REPLY in
                1)echo 春;;
                2)echo 夏;;
                3)echo 秋;;
                4)echo 冬;;
                5) exit ;;
        esac
done

執行結果如下:
shell腳本進階
select代表循環開始,後面接循環條件,他會一直循環下去直到有退出。

2.循環控制命令

break命令
break命令能夠直接結束當前循環結構,即是退出循環,例如

#!/bin/bash
for i in `seq 1 3`;do
                echo $i
                echo 第$i次循環
                                if [ $i -eq 2 ];then
                                                break
                                fi
done

執行結果如下:
shell腳本進階
可以看到當i等於2時,滿足了if的條件,然後執行break,當前循環直接結束,不在執行break之後的任何內容,直接退出循環。
break n 你是數字,可以結束指定層數的循環。
continue命令
continue命令能夠結束當前這一次的循環而直接進入下一次的循環,continue之後的內容不在執行,例如:

#!/bin/bash
for i in `seq 1 3`;do
                echo $i
                                if [ $i -eq 2 ];then
                                                continue
                                fi
                echo 第$i次循環

done

執行結果如下:
shell腳本進階
可以看到在i等於2時,執行到echo $i之後滿足if條件,執行continue,直接結束了i等於2這次循環,不在執行echo 第$i次循環 這句,直接進行i等於3這層循環。
continue n n是數字,可以跳過幾層當前次的循環。
shift命令
shift命令能夠使參數列表左移n次,n是數字,例如:

#!/bin/bash
for ((i=0;i<5;i++));do
        echo $*
        shift
done

執行結果如下:
shell腳本進階
可見,每次循環都會執行shift命令,這是輸出的所有參數都會少第一個參數。
shift n n是數字可以使參數列表左移n次,即是每次都少開始的前n個參數。

3.函數

函數是一系列代碼的集合,當我們定義了一個函數時,我們可以在後面調用這個函數,而且是可以重複調用的,他不是單獨的一個進程,不能獨立運行,而是shell腳本的一部分,函數的生命週期是調用時開始,返回時結束。
創建函數
創建函數有三種方法如下:

1
function f_name {
...函數體...
} 
2
function f_name () {
...函數體...
} 
3
f_name (){
...函數體...
}

刪除函數
刪除函數的方式即是unset加上函數名,例如:

unset  function_name

函數參數
傳遞參數給函數:調用函數時,在函數名後面以空白分隔給定參數列表即可,例如:

function_name 參數1 參數2 ······

這樣我們就可以在函數中使用$1,$2,······$n來引用這些參數
函數文件
我們可以創建屬於我們自己的函數文件,裏面可以是你自己寫的或者是需要的函數
函數調用
我們可以調用我們寫的或者是系統內置的函數來滿足我們的需求。
調用函數文件的方式如下:

.+空格+函數文件名
或者
source+空格+函數文件名

調用腳本中的函數打方式如下

function_name

直接文件名即可,如果有參數,後面可以加上參數。
環境變量,本地變量和局部變量
函數中的定義的環境變量在函數以及當前shell,當前shell的子shell有效,而局部變量只在函數中有效,本地變量只在當前shell和函數中有效,在其他地方無效。
設置局部變量的方法如下:

local can=3

函數遞歸
函數遞歸是指函數自己可以直接或間接調用自身,當最深一層有了返回值之後逐步返回返回值。
函數返回值
返回值有兩種情況:
1
函數的執行結果返回值:
(1) 使用echo等命令進行輸出
(2) 函數體中調用命令的輸出結果
2
函數的退出狀態碼:
(1) 默認取決於函數中執行的最後一條命令的退出狀態碼
(2) 自定義退出狀態碼,其格式爲:
return 從函數中返回,用最後狀態命令決定返回值
return 0 無錯誤返回。
return 1-255 有錯誤返回

4.數組

數組是存儲多個元素的連續的內存空間,相當於多個變量的集合,我們可以通過下面的方式應用數組中的值:

${ARRAY_NAME[INDEX]}

ARRAY_NAME是數組名字,INDEX是數組下標
創建數組
創建數組的方式有四種

declare -a ARRAY_NAME
declare -A ARRAY_NAME

-A是創建關聯數組
給數組賦值
給數組賦值的方法主要有4中,如下:

(1) 一次只賦值一個元素;
ARRAY_NAME[INDEX]=VALUE
weekdays[0]="Sunday"
weekdays[1]="Thursday"
(2) 一次賦值全部元素:
ARRAY_NAME=("a" "b" "c" ...)
(3) 只賦值特定元素:
ARRAY_NAME=([0]="VAL1" [3]="VAL2" ...)
(4) 交互式數組值對賦值
read -a ARRAY

引用數組所有元素

${ARRAY_NAME[*]}
${ARRAY_NAME[@]}
數組的長度(數組中元素的個數):
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}

向數組中追加元素

ARRAY[${#ARRAY[*]}]=value
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章