shell編程之循環


shell編程之循環

1.while循環

循環語句命令常用於重復執行一條指或一組命令,直到條件不滿足停止,shell腳本語方的循環語句常見的有while,until,for以及select循環語句,while循環語句主要用來重復執行一組命令或語句,在企業實際應用中,常用於守護進程或持續運行的程序

1.1 while循環語法

while <條件表達式>
do
    指令...
done

1.2 while循環參

用法 說明
sh while1.sh & 把腳本while1.sh放到后台執行(后台運行腳本時常用)
nohup while1.sh & 使用nohup把腳本while1.sh放到后台執行
ctl+c 停止執行當前腳本或任務
ctl+z 暫停執行當前腳本或任務
bg 把當前腳本或任務放到后台執行,bg可以理解為background
fg 把當前腳本或任務拿到前台執行,如果有多個任務,可以使用fg加任務編號調出對應腳本任務,如fg 2,調出第二個腳本任務,fg可以理解為frontground
jobs 查看當前執行的腳本或任務
kill 關閉執行的腳本任務,即以“kill %任務編號”的形式關閉腳本,這個任務編號,可以通過jobs獲得 t-lang

kill、killall、pkill:殺掉進程。
ps:查看進程。
pstree:顯示進程狀態樹。
top:顯示進程。
renice:改變優先權。
nohup:用戶退出系統之后繼續工作。
pgrep:查找匹配條件的進程。
strace:跟蹤一個進程的系統調用情況。
ltrace:跟蹤進程調用庫函數的情況。

1.3 while循環讀取文件方法

方法一:在while循環結尾done通過輸入重定向指定讀取的文件。
while read line
do
    cmd
done<FILE
方法二:使用cat讀取文件內容,然后通過管道進入while循環處理
cat FILE_PATH|while read line
do
    cmd
done
方法三:采用exec讀取文件后,然后進入while循環處理
exec <FILE
sum=0
while read line
do
    cmd
done

2 while循環案例

2.1 每隔2秒輸出一次系統負載(負載是系統性能的基礎重要指標)情況。

while true
do
    uptime >> /tmp/uptime.log
    sleep 1                                                                                        
done

2.2 猜數字游戲。首先讓系統隨機生成一個數字,給這個數字定一個范圍(1-60),讓用戶輸入猜的數字,對輸入進行判斷,如果不符合要求,就給予高或低的提示,猜對后則給出猜對用的次數,請用while語句實現

[root@ci-node1 while]# cat 2.sh 
#!/bin/bash
##############################################################
# File Name: 2.sh
# Version: V1.0
# Author: liu
# Organization: 
# Created Time : 2019-04-14 00:43:17
# Description:
##############################################################
random="$((RANDOM%60))"
count=0
while true
do
    ((count++))
    read -p "請猜數字:" num
    if [ $num -gt $random ]
    then
        echo "猜高了。"
    elif [ $num -eq $random ]
    then
        echo "牛啊,猜對了,一共猜了${count}次。"
        exit
    else
        echo "猜低了。"
    fi
done

2.3 分析Apache訪問日志(access_2010-12-8.log),把日志中每行的訪問字節數對應字段數字相加,計算出總的訪問量。給出實現程序,請用while循環實現

[root@ci-node1 while]# cat 3.sh 
#!/bin/bash
##############################################################
# File Name: 3.sh
# Version: V1.0
# Author: liu
# Organization: 
# Created Time : 2019-04-14 13:15:03
# Description:
##############################################################
sum=0
awk '{print $10}' access_2010-12-8.log|grep -v - >/tmp/oldboy.log
while read line
do
    ((sum+=line))
done</tmp/oldboy.log
echo $sum

3.for循環

for循環語句和while循環語句類似,但for循環語句主要用於執行次數有限的循環,而不是用於守護進程以及無限循環

3.1 for循環語法

1)普通語法
for 變量名 in 變量取值列表
do
    指令...
done
2)C語言型for循環語法
for((exp1;exp2;exp3))
do
    指令...
done

3.2 for循環案例

3.2.1 用for循環豎向打印1、2、3、4、5共5個數字。

[root@ci-node1 while]# cat 4.sh 
#!/bin/bash
##############################################################
# File Name: 4.sh
# Version: V1.0
# Author: liu
# Organization: 
# Created Time : 2019-04-14 14:11:20
# Description:
##############################################################
for i in 1 2 3 4 5
do
    echo $i
done

3.2.2 通過開發腳本實現僅設置sshd rsyslog crond network sysstat****服務開機自啟動

for name in sshd rsyslog crond network sysstat
do
    systemctl enable $name
done   

3.2.3 計算從1加到100之和

[root@ci-node1 while]# cat 6.sh 
#!/bin/bash
##############################################################
# File Name: 6.sh
# Version: V1.0
# Author: liu
# Organization: 
# Created Time : 2019-04-14 14:42:17
# Description:
##############################################################
sum=0
for num in {1..100}
do
    ((sum+=num))
done
echo $sum
echo --------------------------
for ((i=1;i<=1000000;i++))
do
    ((sum1+=i))
done
echo $sum1

3.2.4 在Linux下批量修改文件名,將文件名中的“_finished”去掉

准備測試數據,如下:

[root@ci-node1 scripts]# mkdir /oldboy -p
[root@ci-node1 scripts]# cd /oldboy/
[root@ci-node1 oldboy]# touch stu_102999_1_finished.jpg stu_102999_2_finished.jpg stu_102999_3_fini
shed.jpg[root@ci-node1 oldboy]# touch stu_102999_4_finished.jpg stu_102999_5_finished.jpg
[root@ci-node1 oldboy]# 

腳本:

[root@ci-node1 while]# cat 7.sh 
#!/bin/bash
##############################################################
# File Name: 7.sh
# Version: V1.0
# Author: liu
# Organization: 
# Created Time : 2019-04-14 14:59:21
# Description:
##############################################################
for file in `ls /oldboy/*.jpg`
do
    mv $file `echo ${file/_finished/}`
done
方法二:rename "_finished" "" *.jpg
方法三:ls *.jpg|awk -F "_finished" '{print "mv",$0,$1$2}'|sh

4.循環控制及狀態返回值應用實踐

4.1 break、continue、exit、return的區別和對比

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

條件與循環控制及程序返回值命令知識表格

命令 說明
break n 如果省略n表示跳出整個循環,n 表示跳出循環的層數
continue n 如果省略n表示跳過本次循環,忽略本次循環的剩余代碼,進入循環的下一次循環。n 表示退到第n層繼續循環
exit n 退出當前shell程序,n為上一次程序執行的狀態返回值。n也可以省略,再下一個shell里可通過$?接收exit n的n值
return n 用於在函數里,作為函數的返回值,用於判斷函數執行是否正確。再下一個shell里可通過$?接收exit n的n值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM