1. 程式人生 > >shell循環判斷語法

shell循環判斷語法

con 3.4 $2 eas break localhost 合規 顯示 發送郵件

for循環

for循環數字1-100得出數字1到100的和

[root@localhost src]# cat fors.sh 
#!/bin/bash
sum=0
for a in `seq 1 100`
 do
 ? sum=$[$a+$sum]
 done
echo $sum 
[root@localhost src]# sh -x fors.sh 
+ sum=0 ? ? ? ? ? ?  部分執行過程
++ seq 1 100
+ for a in ‘`seq 1 100`‘
+ sum=1
+ for a in ‘`seq 1 100`‘
+ sum=3
+ for a in ‘`seq 1 100`‘
+ sum=6
.................省略
+ for a in ‘`seq 1 100`‘
+ sum=4851
+ for a in ‘`seq 1 100`‘
+ sum=4950
+ for a in ‘`seq 1 100`‘
+ sum=5050
+ echo 5050

for循環遍歷出文件或目錄,這裏遍歷出某個目錄下的所有目錄。使用if ?-d來判斷是否是個目錄

[root@localhost src]# cat fors.sh
#!/bin/bash
cd /usr/local/src/
for a in `ls /usr/local/src`
 do
 ?if [ -d $a ]
 ? ?then
 ? echo $a
 ?fi 
 done 
[root@localhost src]# sh fors.sh 
cmake-3.12.2
nginx-1.15.2
php-5.6.37
php-7.1.21
zabbix-3.4.13

for循環會對空格和回車符作為分割符處理,在遍歷後會把以空格相連的文件名會處理成兩個文件(會變為兩個文件名稱來顯示),如有以下幾個文件:

[root@localhost src]# ll *.txt
-rw-r--r-- 1 root root 75 Sep 17 16:32 1.txt
-rw-r--r-- 1 root root 0 Sep 17 16:32 2.txt
-rw-r--r-- 1 root root 0 Sep 17 16:32 5 3.txt
[root@localhost src]# sh foss.sh 
/usr/local/src/1.txt
/usr/local/src/2.txt
/usr/local/src/5
3.txt

for循環處理空格分割的文件或字符串時會把空格作為換行符來處理,導致一個含有空格的目錄或文件的一串字符會變為兩串字符

while循環

語法 while 條件; do 語句; done ? ? ? ?//這個寫法的 true和while :; ?表示死循環

這裏使用while循環簡單判斷監控一個數值,如果獲取的數值大於特定值則執行某些操作,操作可以是執行發送郵件,sleep表示每隔多少秒執行一次整個循環

[root@localhost src]# cat while.sh 
#!/bin/bash
while true
 do
 ? load=`w |head -1 |awk -F ‘load average:‘ ‘{print $2}‘ |cut -d. -f1`
 ? ?if [ $load -gt 10 ]
 ? ? ?then 
 ? ? ? ? echo "1234" ? ? ? ?  //這裏也可以是發送郵件的命令
 ? ?fi
 ? ? ? sleep 10
 ?done

while結合if來判斷一個輸入的數值是否符合規則
while循環輸入一個 數值來正確判斷,來判斷輸入的值是否是一個純數字,如果不是則會繼續執行循環讓繼續來輸入值,直到輸入正確為止,直至輸入正確後才會結束並退出這個while循環
第一次read -p把輸入值賦予給變量n,讓變量n和一個特定值做下比對,如果符合條件則跳過這個判斷結果並使用continue結束單次循環並echo出結果。
如果輸入的字符不為數字,且變量不是空的話,那麽該次判斷不會結束循環並往下執行。將輸入變量所有的數字替換為空。
如果包含字母則無法替換為空。並且把替換的這個結果做一個非空判斷,如果輸入的是數字的話,那麽這個值已經被替換成空的了。如果是非數字則不能針對字母做替換,然後繼續循環讓輸入一個純數字

while :;
 ? do
 ? ? read -p "Please input a number: "  n
 ?if [ -z "$n" ]
 ? ? then
 ? ? ? echo "輸入驗證"
 ? ? ? ? continue
 ?fi
 ? ?n1=`echo $n |sed ‘s/[-0-9]//g‘`
 ?if [ ! ?-z "$n1" ]
 ? ? then 
 ? ? ? echo "請輸入一個純數字"
 ? ? ? ? continue
 ?fi
 ? ? break
done
echo $n

break跳出循環

在循環判斷中,如果獲取的一個變量大於或等於特定值時,則會執行該判斷下的執行語句,這個語句且是break跳出動作並繼續執行腳本中剩下的語句,那麽這個循環如果等於或大於這個特定值就會執行break,執行break後,則這個循環中還有其他語句或判斷的話則不會去執行了,直接終止這個循環語句

[root@localhost src]# cat while.sh 
#!/bin/bash
for i in `seq 1 4`
do 
 echo $i
 ? if [ $i -eq 3 ]
 ? ? then
 ? ? ?  break
 ? fi
 ?echo $i
done
echo abc 
[root@localhost src]# sh  while.sh 
1
1
2
2
3
abc

continue結束本次循環

continue結束的循環是匹配特定值的本次循環。如果獲取的數值等於或大於特定值,則結束本次循環,並終止執行continue以下的語句。但是結束本次循環後並非退出循環,而是繼續從循環中獲取數據來執行特定語句,直到這個循環範圍結束(如1-6、a-f ?等)

[root@localhost src]# cat continue.sh 
#!/bin/bash
for i in `seq 1 4`
do 
 echo $i
 ? if [ $i -eq 3 ]
 ? ? then
 ? ? ?  continue
 ? fi
 ?echo $i
done
echo abc 
[root@localhost src]# sh while.sh 
1
1
2
2
3
4
4
5
5
abc

exit退出整個腳本

如果判斷一個從循環獲取的變量大於或等於特定值,恰好循環獲取的值匹配上了特定值時,則會執行該判斷下的語句和exit退出動作,exit ?退出表示我之下的所有內容和不在我這個循環內的內容都不執行了,直接退出整個腳本

?

[root@localhost src]# cat exit.sh 
#!/bin/bash
for i in `seq 1 5`
do
 ? ?echo $i
 ? ?if [ $i == 3 ]
 ? ?then
 ? ? ? ?exit
 ? ?fi
 ? ?echo $i
done
echo aaaaaaa

shell循環判斷語法