Shell流程控制語句(if/for/while/until/case)

5.if語句

5.1 單分支結構

​ (條件表達式)部分可以是test、[]、[ [ ] ]、( ( ) )等條件表達式,甚至可以直接使用命令作爲條件表達式。每個if條件語句都有if開頭,並帶有then,最後以fi結尾。相當於**[ 條件表達式 ] && 指令**

if (條件表達式)
    then
        指令
fiif (條件表達式); then                                #分號相當去換行命令
    指令
fi

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-DanhV73R-1583994947312)(file:///C:/Users/YCY/AppData/Local/Temp/msohtmlclip1/02/clip_image001.png)]

5.2 if條件語句的嵌套

if (條件表達式)
    then
	if (條件表達式)
	    then
            指令
	fi
fi

5.3 if雙分支結構

​ 相當於**[ 條件表達式 ] && 指令集1 || 指令集2**。

if (條件表達式)
    then
        指令集1
    else
		指令集2
fi

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tjuhYD7s-1583994947316)(file:///C:/Users/YCY/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)\

5.4 if多分支結構

​ 注:最後結尾的else後面沒有then。

if (條件表達式1)
    then
        指令集1
elif (條件表達式2)
    then
	指令集2
……
else
	指令集3
fi


[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VyDadD76-1583994947323)(file:///C:/Users/YCY/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)]

[root@Centos7 ~]# cat grade.sh 
#!/bin/bash

read -p "Please input your score:" grade
if [[ $grade -lt 0 && $grade -gt 100 ]]
    then
	echo "invalid input!"
elif [[ $grade -ge 85 && $grade -le 100 ]]
    then
	echo "excellent"
elif [[ $grade -ge 75 && $grade -le 84 ]]
    then
	echo "well"
elif [[ $grade -ge 60 && $grade -le 74 ]]
    then
	echo "pass"
else
        echo "fail"
fi
[root@CentOS7 ~]# chmod +x grade.sh 
[root@CentOS7 ~]# ./grade.sh
Please input your score:85
excellent
[root@CentOS7 ~]# ./grade.sh
Please input your score:75
well
[root@CentOS7 ~]# ./grade.sh
Please input your score:60
pass
[root@CentOS7 ~]# ./grade.sh
Please input your score:54
fail

5.5 if條件語句多種條件表達式語法

5.5.1 test條件表達式

if test 表達式
    then
		指令
fi

**

5.5.2 []條件表達式

if [ 字符串或算術表達式 ]
    then
		指令
fi

5.5.3 [[]]條件表達式

if [[ 字符串表達式 ]]
    then
		指令
fi

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mJ90FwHI-1583994947324)(C:\Users\YCY\AppData\Roaming\Typora\typora-user-images\image-20200312141638894.png)]

5.5.4 ( ( ) )條件表達式

if ( ( 算術表達式 ) )
    then
		指令
fi

5.5.5 命令表達式

if 命令
    then
		指令
fi

6.循環語句

6.1 for循環

計算機生成了可選文字: 持續 循環, 直到 條件 表達 式不 滿足 for循環開始 or循環條件表、大 真 do 命令集 done

6.1.1 列表循環

​ 列表for循環:用於將一組命令執行已知的次數

​ 在這種for循環語句語法中,for關鍵字後面會有一個“變量名”,變量名依次獲取in關鍵字後面的變量取值列表內容(以空格分隔),每次僅取一個,然後進入循環(do和done之間的部分)執行循環內的所有指令,當執行到done時結束本次循環。之後,“變量名”再繼續獲取變量列表裏的下一個變量值,繼續執行循環內的所有指令,當執行到done時結束返回,以此類推,直到取完變量列表裏的最後一個值並進入循環執行到done結束爲止。

​ 此結構中“in 變量名列表”可以省略,省略時相當於in “@"fori使foriin"@",也就是說for i相當於使用for i in "@”。格式如下:

for 變量名 in 變量取值列表
do
	指令
donefor 變量名 in 變量取值列表; do
	指令
done
[root@Centos7 ~]# cat for1.sh 
#!/bin/bash

for var in {1..5}
do
	echo $var
done
#打印0-100所有偶數
[root@Centos7 ~]# cat for2.sh 
#!/bin/bash

for i in {0..100..2}
do
        echo $i
done

6.1.2 不帶列表循環

​ 不帶列表的for循環執行時由用戶指定參數和參數的個數。格式爲:

for 變量名; do
	指令
done
[root@Centos7 ~]# cat for3.sh 
#!/bin/bash

for i
do
        echo $i
done

6.1.3 C語言型for循環語句

​ for關鍵字後的雙括號內是三個表達式,第一個是變量初始化,第二個爲變量的範圍,第三個爲變量自增或自減。當第一個表達式的初始化值符合第二個變量的範圍時,就進入循環執行;當條件不滿足時就退出循環。格式爲:

for((exp1; exp2; exp3)) 
do 
    指令
done
[root@Centos7 ~]# cat for4.sh 
for((i=1;i<=5;i++))
do
        echo $i
done

6.2 while循環

​ while循環語句會對緊跟在while命令後的條件表達式進行判斷,如果該條件表達式成立,則執行while循環體裏的命令或語句(即語法中do和done之間的指令),每一次執行到done時就會重新判斷while條件表達式是否成立,直到條件表達式不成立時纔會跳出while循環體。如果一開始條件表達式就不成立,那麼程序就不會進入循環體(即語法中do和done之間的部分)中執行命令了。

while 條件表達式
do
    指令
done
[root@Centos7 ~]# i=1;while [ $i -le 5 ];do echo $i;let i++;done
1
2
3
4
5

6.3 until循環語句

​ until循環語句的用法與while循環語句的用法類似,區別是until會在條件表達式不成立時,進入循環執行指令;條件表達式成立時,終止循環。

until 條件表達式
do
    指令
done
[root@Centos7 ~]# i=1;until (($i > 5));do echo $i;let i++;done
1
2
3
4
5

6.4 循環嵌套

[root@Centos7 ~]# cat test.sh 
#!/bin/bash

for i in {1..5}
do
    for ((j=1;j<=$i;j++))
    do
	echo -n $j
    done
    echo ""
done

6.5 循環中斷語句

​ break、continue在條件語句及循環語句(for、while、if等)中用於控制程序的走向;而exit則用於終止所有語句並退出當前腳本,除此之外,exit還可以返回上一次程序或命令的執行狀態值給當前Shell;return類似於exit,只不過return僅用於在函數內部返回函數執行的狀態值。

命令 說明
break n 如果省略n,則表示跳出整個循環,n表示跳出循環的層數
contiune n 如果省略n,則表示跳過本次循環,忽略本次循環的剩餘代碼,進入循環的下一次循環。n表示對倒第n層繼續循環
exit n 退出當前shell程序,n爲上一次程序執行的狀態返回值,可以省略。可通過$?接受其退出值
return n 用於在函數裏作爲函數的返回值,以判斷函數執行是否正確。在下一個shell裏可通格$?接受返回值
shift n 使位置參數向左移動,默認移動一位
[root@Centos7 ~]# cat shift.sh 
#!/bin/bash

sum=0
while [ $# -ne 0 ]
do
    let sum=$sum+$1
    shift
done
echo sum=$sum

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XwxXBQQy-1583994947326)(C:\Users\YCY\AppData\Roaming\Typora\typora-user-images\image-20200312142722309.png)]

批量創建用戶

[root@server1 ~]# vim create_user.sh 
#!/bin/bash

echo user{1..5}:y$[$RANDOM%10000+1]abc | tr ' ' '\n' > passwd.txt
for i in {1..5}
do
    user=`head -$i passwd.txt | tail -1 | cut -d: -f1`
    pass=`head -$i passwd.txt | tail -1 | cut -d: -f2`
    useradd $user
    echo $pass | passwd --stdin $user &>/dev/null
done
echo "success"

6.6 自定義Shell分隔符

​ 默認情況下,bash shell會以空格、製表符、換行符作爲分隔符。通過IFS來自定義爲分隔符。

​ 指定單個字符作爲分隔符:IFS=: 以冒號做爲分隔符,可以指定多個,如IFS=’\n:;’,這個賦值會將反斜槓、n、冒號、分號作爲字段分隔符

注:$’\n’與’\n‘時的區別

IFS=’\n’,將字符\和字符n作爲IFS的換行符

IFS=’$\n’,真正使用換行符作爲字段分隔符

7.流程控制語句case

​ case控制語句用來對程序流程的選擇、循環、轉向和返回等進行控制。case是開關語句的一個組成部分,它是根據變量的不同進行取值比較,然後針對不同的取值分別執行不同的指令,相當於多分支的if/elif/else條件語句,常被應用於實現系統服務啓動腳本等應用場景中。

​ 在case語句中,程序會將case獲取的變量的值與表達式部分的值1、值2、值3等逐個進行比較,如果獲取的變量值和某個值(例如值1)相匹配,就會執行值(例如值1)後面對應的指令(例如指令1,其可能是一組指令),直到執行到雙分號(;;)才停止,然後再跳出case語句主體,執行case語句(即esac字符)後面的其他命令。

​ 如果沒有找到匹配變量的任何值,則執行“*)”後面的指令(通常是給使用者的使用提示),直到遇到雙分號(;;)(此處的雙分號可以省略)或esac結束,這部分相當於if多分支語句中最後的else語句部分。另外,case語句中表達式對應值的部分,還可以使用管道等更多功能來匹配。

case "變量" in
       值1)
        指令1
           ;;
       值2)
        指令2
         ;;
    *)
        指令3   
esac

編寫apache啓動腳本

case $1 in
    start)
        systemctl $1 httpd &>/dev/null && echo "start successfully"
        ;;
    restart)
        systemctl $1 httpd &>/dev/null && echo "restart successfully"
        ;;
    stop)
        systemctl $1 httpd &>/dev/null && echo "stop successfully"
        ;;
    status)
        systemctl $1 httpd &>/dev/null && echo "view status"
        ;;
    *)
        echo "USAGE:$0 start|restart|stop|status"
        ;;
esac

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QJSkcHa6-1583995737162)(C:\Users\YCY\AppData\Roaming\Typora\typora-user-images\image-20200312144834124.png)]

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