5.if語句
5.1 單分支結構
(條件表達式)部分可以是test、[]、[ [ ] ]、( ( ) )等條件表達式,甚至可以直接使用命令作爲條件表達式。每個if條件語句都有if開頭,並帶有then,最後以fi結尾。相當於**[ 條件表達式 ] && 指令**
if (條件表達式)
then
指令
fi
或
if (條件表達式); then #分號相當去換行命令
指令
fi
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
[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
5.5.4 ( ( ) )條件表達式
if ( ( 算術表達式 ) )
then
指令
fi
5.5.5 命令表達式
if 命令
then
指令
fi
6.循環語句
6.1 for循環
6.1.1 列表循環
列表for循環:用於將一組命令執行已知的次數
在這種for循環語句語法中,for關鍵字後面會有一個“變量名”,變量名依次獲取in關鍵字後面的變量取值列表內容(以空格分隔),每次僅取一個,然後進入循環(do和done之間的部分)執行循環內的所有指令,當執行到done時結束本次循環。之後,“變量名”再繼續獲取變量列表裏的下一個變量值,繼續執行循環內的所有指令,當執行到done時結束返回,以此類推,直到取完變量列表裏的最後一個值並進入循環執行到done結束爲止。
此結構中“in 變量名列表”可以省略,省略時相當於in “@”。格式如下:
for 變量名 in 變量取值列表
do
指令
done
或
for 變量名 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