shell中的循環語句一般有:
for while until
一、for
for 變量名 in 列表;do
循環體
done
首先將in后list列表的第一個常數或字符串賦值給循環變量,
然后執行循環體;依次賦值列表中的字段,最后執行done命令后的命令序列。
list列表生成方式:
(1) 直接給出列表 1 2 3
(2) 整數列表:
(a) {start..end} {1..10}
(b) $(seq [start [step]] end) `seq 1 10`
(3) 返回列表的命令 $(COMMAND)
(4) 使用glob,如:*.sh
(5) 變量引用; $@, $*
提示輸入正整數n的值,計算1+2+3+…n的 總和
read -p "please enter a positive integer:" n for i in $(seq 1 $n 2>/dev/null);do let s+=i done done echo "sum=$s"
特殊用法:類似C語言for
for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式))
do
循環體
done
雙小括號:實現C風格變量操作 ((i++))
控制變臉初始化:僅在第一次循環時執行
控制變量的修正表達式:會在進入下一輪循環前先執行
1到100正整數和for實現
for((i=1;i<=100;i++));do let sum+=i done echo $sum
二、while
while CONDITION; do
循環體
done
條件為真,執行循環;
條件為假,退出循環。
直到不符合條件則退出循環
CONDITION:循環控制條件;進入循環之前,先做一次判斷;每次循環后再次判斷;
CONDTION變量的值應為變化的;應該在循環體不斷地被修正;創造退出循環的條件
1到100內所有正整數和while實現
i=1 while [ $i -le 100 ];do let s=s+i let i++ done echo "$s"
特殊用法:
while read line; do
循環體
done < /PATH/FROM/SOMEFILE
依次讀取文件中的每一行復制給變量line
掃描/etc/passwd文件每一行,如發現GECOS字段為空,則填 充用戶名和單位電話為62985600,
并提示該用戶的GECOS信 息修改成功。
while read line ;do user=`echo $line|cut -d: -f1` gc=`echo $line|cut -d: -f5` [ -z $gc ]&>/dev/null && usermod -c "$user 62985600" $user && printf "%-12s %s\n" $user "GECOS changed" done < /etc/passwd echo finished
三、until
until CONDITION; do
循環體
done
條件為假,執行循環
條件為真,退出循環
直到符合條件退出循環
1到100正整數和until實現
i=0 until [ $i -gt 100 ];do let sum+=i let i++ done echo $sum
循環控制語句:
一般結合判斷語句使用,用于跳過某些指定情況
1)continue # #為第幾層,最內層為1層
提前結束第#層的本輪循環,直接進入#層下一輪判斷。
2)break # 結束#層循環,最內層為1層
直接結束#層循環體,#層后續的循環不再執行。
作業:
1、每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶hacker登錄,則將登錄時間和主機記錄于日志/var/log/login.log中,并提示該用戶退出系統。
#!/bin/bash # echo until w|cut -d ' ' -f1|grep "hacker" ;do let i++ echo -e "\b\r$i \t `date` \t no hacker" sleep 3 done echo "should logout"|mail -s 'warning' hacker echo "is here ! ! !" echo -e "`date` warning! `w|grep "^hacker"`">>/var/log/messages
2、隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出
#!/bin/bash # n=$[RANDOM%11] num=a until [ $num -eq $n ]&>/dev/null;do read -p "please enter a numbe [0-10]:" num if [ -z $num ] ;then continue 2 elif [[ ! $num =~ 1?[0-9] ]] ;then continue 2 elif [ $num -gt $n ] ;then echo " your number is bigger" elif [ $num -lt $n ] ;then echo " your number is smaller!" fi done echo you hit the number! $n
3、編寫腳本,求100以內所有正整數之和
#!/bin/bash #zjj i=0 until [ $i -gt 100 ];do let sum+=i let i++ done echo $sum
4、編寫腳本,通過ping命令探測172.16.250.1-254范圍內的所有主機的在線狀態,統計在線主機和離線主機各多少。
#!/bin/bash # i=1 NumUp=0 NumDown=0 echo until [ $i -gt 254 ];do if ping -W1 -c1 10.1.252.$i &>/dev/null ;then let NumUp++ echo -e "\n\t\t 10.1.252.$i is up $NumUp" else let NumDown++ echo -e "\b\r$NumDown down" fi let i++ done
5、編寫腳本,打印九九乘法表
#!/bin/bash # i=1 until [ $i -gt 9 ];do j=1 until [ $j -gt $i ];do echo -n -e "${j}*${i}=$[$i*$j]\t" let j++ done echo let i++ done
6、編寫腳本,利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者
#!/bin/bash #zjj i=1 ran=$RANDOM max=$ran min=$ran echo $ran until [ $i -gt 9 ];do ran=$RANDOM echo $ran if [ $ran -gt $max ];then max=$ran elif [ $ran -lt $min ];then min=$ran fi let i++ done echo MAX=$max MIN=$min
7、編寫腳本,實現打印國際象棋棋盤
#!/bin/bash # i=1 row=1 until [ $row -gt 8 ] ;do column=1 until [ $column -gt 8 ] ;do i=$[$i%2] if [ $i -eq 1 ];then echo -ne "\033[47m \033[0m" else echo -ne "\033[41m \033[0m" fi let i++ let column++ done echo let row++ let i++ done
8、打印等腰三角形 (菱形)
#!/bin/bash # read -p "enter the number of line:" line for((i=1;i<=$line;i++)) do count=$[2*$i-1] sapce=$[$line-$i+1] printf "%${sapce}c" ' ' for((j=1;j<=$count;j++));do echo -n "*" done echo done for((i=$[line-1];i>=1;i--)) do count=$[2*$i-1] sapce=$[$line-$i+1] printf "%${sapce}c" ' ' for((j=1;j<=$count;j++));do echo -n "*" done echo done
9.安裝centos6.7,用centos6.8kernel升級
原創文章,作者:Jasper,如若轉載,請注明出處:http://www.www58058.com/36913