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值 |