Linux系統shell編程之for迴圈語句,linuxshell
Linux系統shell編程之for迴圈語句。
1.for迴圈語句和while迴圈類似,但是for迴圈主要是用於執行次數有限的迴圈,而不是守護進程及無限迴圈,那麼for迴圈的文法如下:
for 變數名 in 變數取值列表do指令done
在這種for迴圈文法中,在for關鍵字後面會有一個變數名,變數名會依次的擷取in後面的變數取值列表的內容,每取一個然後迴圈do 和done之間的部分 也就是指令。 之後再次迴圈下一個變數取值列表 然後執行do done之間的部分,直到變數取值列表的最後一個值並進入迴圈體後才結束。
2.第二種文法就是C語言型的for迴圈語句如下:
for ((exp1;exp2;exp3))do指令done
例如1:
for ((a=1;a<=10;a++))doecho $adone
輸出結果如下:
[root@yankerp shell]# sh for_check.sh 12345678910[root@yankerp shell]#
剖析:
for ((a=1;a<=10;a++)) #a=1 那麼a就是1 a<=10 那麼1<10 但是不等於10 所以後面a++增加1doecho $a #第一次輸入$a是1 那麼第二次 a++ 等於a+1 也就是1+1 第二次輸出2 直到a=10done #結束
以上的for迴圈類似於while語句 如下:
a=1while ((a<=10))doecho $a((a++))done
輸出結果如下:
[root@yankerp shell]# sh while.sh 12345678910[root@yankerp shell]#
如果希望程式能夠持續運行,那麼while迴圈是最好的選擇。
如果是限次迴圈的話,則多用for迴圈!!!
3、for迴圈的基礎實踐
例1:使用for迴圈列印 1 2 3 4 5 數字如下:
#!/bin/bashfor zhangsan in 1 2 3 4 5do echo $zhangsandone
剖析如下:
在for關鍵字後面會有一個變數名,變數名會依次的擷取in後面的變數取值列表的內容,每取一個然後迴圈do 和done之間的部分 也就是指令。 之後再次迴圈下一個變數取值列表 然後執行do done之間的部分,直到變數取值列表的最後一個值並進入迴圈體後才結束。
最後輸出內容:
[root@yankerp shell]# sh for_check.sh 12345[root@yankerp shell]#
例如2:使用{}來列印1 2 3 4 5
在前幾篇文章中有提過{}的用處,例如列印1-15 或者 a-z
[root@yankerp shell]# echo {1..15} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15[root@yankerp shell]# echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z[root@yankerp shell]#
使用for迴圈結合{}迴圈
[root@yankerp shell]# cat for_check.sh #!/bin/bashfor zhangsan in {1..5} #或者 {a..z}do echo $zhangsandone[root@yankerp shell]# sh for_check.sh 12345[root@yankerp shell]#
輸出a-z
[root@yankerp shell]# sh for_check.sh abcdefghijklmnopqrstuvwxyz[root@yankerp shell]#
執行個體3:批量修改檔案尾碼
我們看到 在這個目錄下有這麼多檔案,但是他們的尾碼名不同,但是需求就是我想把以txt格式的檔案,都改為.sh的 第一種方法,一條條的手動改,第二種方法如下:
1.首先我們要改尾碼名,我們先定義一個變數測試
[root@yankerp data]# aaa=csdn.txt[root@yankerp data]# echo $aaacsdn.txt[root@yankerp data]# echo $aaa | cut -d . -f1 csdn[root@yankerp data]# echo "`echo $aaa | cut -d . -f1`".shcsdn.sh[root@yankerp data]#
剖析如下:
[root@yankerp data]# aaa=csdn.txt #定義一個變數 aaa=csdn.txt 那麼aaa就是csdn.txt[root@yankerp data]# echo $aaa?????#echo $aaa 就是 csdn.txtcsdn.txt #輸出的結果[root@yankerp data]# echo $aaa | cut -d . -f1 #在這裡我們使用cut命令通過.為分隔字元截取第一段 csdn????????#截出來的csdn 那麼我們想,這時候在csdn後面加上一個.sh 是不是就好了 如下:[root@yankerp data]# echo "`echo $aaa | cut -d . -f1`".sh????#在以上的命令後面加上.sh 就實現了這個效果csdn.sh[root@yankerp data]#
以上是一個變數的方法,那麼接下來編寫for迴圈修改的方式
2.我們是需要把txt尾碼改為sh結尾,那麼我們肯定是要找出在這裡目錄下所有以txt檔案結尾的檔案如下:
[root@yankerp data]# ls | grep txt$a.txtb.txtc.txtd.txtuuub.txt[root@yankerp data]#
到這裡我想應該很清楚了,接下來修改的方式和上面變數的方式一樣 如下:
#!/bin/bashcd /root/data || { echo "進入目錄失敗!!!" exit 1}for zhangsan in `ls | grep txt$`do mv $zhangsan `echo $zhangsan | cut -d . -f1`.shdone
3.剖析:
#!/bin/bashcd /root/data || { #進入檔案目錄 echo "進入目錄失敗!!!" #判斷是否進入成功!!! exit 1}for zhangsan in `ls | grep txt$` #張三是一個變數 那麼後面跟著那條命令 也就是所有以txt結尾的檔案,開始迴圈do mv $zhangsan `echo $zhangsan | cut -d . -f1`.sh #這個就是上面的那個變數的命令。done
修改如下:
執行個體4:批量解壓檔案,如下:
在這個目錄下我們看到有很多的包,但是有.tar.gz 的 有rar的 有zip的包,但是呢,我就想解壓.tar.gz的包,第一種方法,手動一個個解壓,那麼第二種方式如下:
1.查看以.tar.gz的包有幾個
2.編寫指令碼如下:
#!/bin/bashcd /root/data || { echo "進入目錄失敗!!!" exit 1}for zhangsan in `ls | grep .tar.gz$`do tar zxf $zhangsan -C /root/logdoneif [ "$?" -eq 0 ];then echo ".tar.gz 成功!!!" else echo "失敗!!!"fi
運行結果如下:
執行個體5:開發大量建立使用者指令碼
首先大量建立使用者還是很好實現的,如下:
#!/bin/bashNAME=yankaifor zhangsan in `seq -w 1 5`do useradd $NAME$zhangsandoneif [ "$?" -eq 0 ];then echo "建立使用者成功!!!" else echo "建立使用者失敗!!!" exit 1fi
運行如下:
但是問題來了,怎麼去給使用者加密碼,使用者是肯定要求輸入密碼的,普通我們給一個使用者佈建密碼如下:
[root@yankerp ~]# echo 123456 | passwd --stdin zhangsan更改使用者 zhangsan 的密碼 。passwd:所有的身分識別驗證令牌已經成功更新。[root@yankerp ~]#
我們隨機匹配密碼可以通過$RANDOM|md5sum進行加密的方式來截取前8位 如下:
那麼接下來我們就有一定的思路去寫指令碼了如下:
#!/bin/bash. /etc/init.d/functionsNAME=yankaiZF=`seq 1 10`for user in $ZFdouseradd $NAME$userPASS="`echo $RANDOM|md5sum | cut -c 1-8`"echo "$PASS" | passwd --stdin $NAME$user &>/dev/nullecho "$NAME$user的密碼為:$PASS"if [ "$?" -eq 0 ] then action "$NAME$user is ok!" /bin/true else action "$NAME$user not ok!" /bin/false exit 1fidone
執行如下:
剖析如下:
#!/bin/bash. /etc/init.d/functions #載入函數庫NAME=yankai#定義名字為yankaiZF=`seq 1 10`#這個取1-10的數字for user in $ZF#for迴圈 user是變數 $ZF取數值douseradd $NAME$user #建立yankai賬戶並+1PASS="`echo $RANDOM|md5sum | cut -c 1-8`" #定義隨機密碼 取前8位echo "$PASS" | passwd --stdin $NAME$user &>/dev/null#設定使用者密碼echo "$NAME$user的密碼為:$PASS" #輸出使用者密碼if [ "$?" -eq 0 ]#進行判斷 then action "$NAME$user is ok!" /bin/true else action "$NAME$user not ok!" /bin/false exit 1fidone #以上內容一直迴圈 直到seq 1-10 已經達到了10 那麼退出迴圈!!
案例6:開發檢測URL指令碼
內容如下:
#!/bin/bash. /etc/init.d/functionsfunction URL_Check(){ wget --spider http://$1 &>/dev/null if [ "$?" -eq 0 ]; then action "$1 檢測成功!" /bin/true else action "$1 檢測失敗!" /bin/false fi}web="www.baidu.comwww.jd.comwww.taobao.comwww.4399.comwww.baidu123.comwww.ywydhajkw.comwww.hahahhaha.conmwww.dhadwkldm.com" for url in $web do URL_Check $urldone
運行結果如下:
以上僅供參考,若寫的不好,請見諒,非專業
剖析如下: