流程控制:
順序執行
選擇執行
循環執行
循環執行:
將某代碼段重復運行多次
重復運行多少次:
循環次數事先已知
循環次數事先未知
有進入條件和退出條件
for循環
for 變量名 in 列表;do 循環體 done
執行機制:
依次將列表中的元素賦值給“變量名”;每次賦值后即執行一次循環體;直到列表中的元素耗盡,循環結束
列表生成方式:
(1)直接給出列表
(2)整數列表:
(a){start..end}:
以start開始,end結束
{start..end..step}:
step:步長
以start開始,end結束,每次start加step,而不是加1
(b)$(seq [start [step]] end)
(3)返回列表的命令
$(COMMAND)
(4)使用glob,如:*.sh
(5)變量引用;
$@, $*
練習: 用for實現
1、判斷/var/目錄下所有文件的類型
#!/bin/bash #description Input /var file type #version 0.1 #author gaomeng #date 20160816 for file in /var/* ;do if [ -h $file ] ;then echo "$file is link file." elif [ -f $file ] ;then echo "$file is common file." elif [ -d $file ] ;then echo "$file is dir file" elif [ -b $file ] ;then echo "$file is block file." elif [ -c $file ] ;then echo "$file is char file." elif [ -S $file ] ;then echo "$file is socket file." elif [ -p $file ] ;then echo "$file is pipe file." else echo "$file is other file." fi done
[root@CentOS6 bin]# varfiletype.sh /var/account is dir file /var/cache is dir file /var/crash is dir file /var/cvs is dir file /var/db is dir file /var/empty is dir file /var/games is dir file /var/gdm is dir file /var/l8i8m is common file. /var/lib is dir file /var/local is dir file /var/lock is dir file /var/log is dir file /var/lte1l is common file. /var/lte4l is common file. /var/mail is link file. /var/nis is dir file /var/opt is dir file /var/preserve is dir file /var/run is dir file /var/spool is dir file /var/tmp is dir file /var/www is dir file /var/yp is dir file
2、 添加10個用戶user1-user10 ,密碼同用戶名
#!/bin/bash #description add 10 new users #version 0.1 #author gaomeng #date 20160816 for id in {1..10};do if id user$id &> /dev/null ;then echo "user$id is exist." else useradd user$id echo user$id | passwd --stdin user$id &> /dev/null echo "Add user$id succeed." fi done
[root@CentOS6 bin]# adduser10num.sh Add user1 succeed. Add user2 succeed. Add user3 succeed. Add user4 succeed. Add user5 succeed. Add user6 succeed. Add user7 succeed. Add user8 succeed. Add user9 succeed. Add user10 succeed.
3、/etc/rc.d/rc3.d 目錄下分別有多個以K開頭和以S開頭的文件;分別讀取每個文件,以K 開頭的文件輸出為文件加stop,以S 開頭的文件輸出為文件名加start;“ “K34filename stop”,“S66filename start”
#!/bin/bash #description #version 0.1 #author gaomeng #date 20160816 for file in `ls /etc/rc.d/rc3.d`;do if echo $file | grep -q "^S" ;then echo "$file start" elif echo $file | grep -q "^K" ;then echo "$file stop" fi done
[root@CentOS6 bin]# file-rc3.sh K01smartd stop K02oddjobd stop K05wdaemon stop K10psacct stop K10saslauthd stop K15htcacheclean stop S01sysstat start S02lvm2-monitor start S03vmware-tools start S08ip6tables start S10network start S11auditd start S11portreserve start
4、寫一個腳本,提示輸入正整數n的值,計算1+2+3+…n的總和
#!/bin/bash #desvription Input 1-N sum #version 0.1 #author gaomeng #date 20160816 read -p "Input one number: " id for num in $(seq $id) ;do let sum+=num done echo "1 and $id sum: $sum"
[root@CentOS6 bin]# sum1-N.sh Input one number: 20 1 and 20 sum: 210
5、寫一個腳本,提示請輸入網絡地址,如192.168.0.0 ,判斷輸入的網段中主機在線狀態
#!/bin/bash #description #version 0.1 #author gm #date 20160815 #read -p "Input one ip address: " ip_addr ip_addr=$1 echo $ip_addr | grep -qE "^(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>$" if [ $? -eq 0 ];then echo "this is a useful ip" else echo "this is not useful ip" exit 20 fi ip=`echo $ip_addr | cut -d. -f1,2,3 ` for IP in {0..255};do ping -c1 -W1 $ip.$IP &> /dev/null && echo "$ip.$IP is up" done
[root@CentOS6 bin]# ping-ip.sh please input one useful ip:10.1.1.0 this is a useful ip [root@CentOS6 bin]# ping-ip.sh please input one useful ip:1.1.1.1. this is not useful ip
6、打印九九乘法表
#!/bin/bash #description Input 9*9 #version 0.1 #author gaomeng #date 20160816 for i in {1..9};do for j in $(seq 1 $i) ;do echo -n -e "$j*$i=$[i*j]\t" done echo done
[root@CentOS6 bin]# 9and9.sh 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
while循環
while CONDITION; do 循環體 done
CONDITION:
循環控制條件;進入循環之前,先做一次判斷
每一次循環之后會再次做判斷;條件為“true” ,則執行一次循環
直到條件測試狀態為“false” 終止循環
因此:CONDTION 一般應該有循環控制變量;而此變量的值會在循環體中不斷地被修改
進入條件:CONDITION為true
退出條件:CONDITION為false
練習:用while實現
1 、求100 以內所有正整數之和
#!/bin/bash #description sum 1 to 100 #version 0.1 #author gaomeng #date 20160816 i=100 while [ $i -gt 0 ] ; do let sum+=i let i-- done echo "sum=$sum"
[root@CentOS6 bin]# while1-100.sh sum=5050
2 、通過ping 命令探測10.1.251.1-254 范圍內的所有主機的在線狀態,統計在線主機和離線主機各多少。
#!/bin/bash #description ping network ip #version 0.1 #author gaomeng #date 20160816 ip=`echo $1 | cut -d. -f1-3` i=254 while [ $i -gt 0 ] ; do ping -c1 -W1 $ip.$i &> /dev/null && let up++ let i-- done let down=254-up echo "up is $up, down is $down"
[root@CentOS6 bin]# whileping.sh 10.1.252.0 up is 32, down is 222
3、打印九九乘法表
#!/bin/bash #description Input 9*9 #version 0.1 #author gaomeng #date 20160816 i=1 while [ $i -le 9 ] ; do j=1 while [ $j -le $i ] ; do echo -ne "$j*$i=$[$j*$i]\t" let j++ done echo let i++ done
[root@CentOS6 bin]# while9and9.sh 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
4、利用變量RANDOM 生成10 個隨機數字,輸出這個10 數字,并顯示其中的最大者和最小者
#!/bin/bash #author goameng #version 0.2 #description: random 10 number. Input max min number #date 20160816 max=$RANDOM min=$max echo $max i=9 while [ $i -gt 0 ];do num=$RANDOM echo $num if [ $num -gt $max ];then max=$num; elif [ $num -lt $min ];then min=$num; fi let i-- done echo "max number is: $max" echo "min number is: $min"
[root@CentOS6 bin]# random.sh 32734 1975 15773 12190 25136 26654 6478 26146 23956 12014 max number is: 32734 min number is: 1975
5、打印國際象棋棋盤
#!/bin/bash #version 0.1 #author gaomeng #description pintf chess #date 20160816 i=8 while [ $i -gt 0 ];do j=8 while [ $j -gt 0 ];do sum=$[$i+$j] if `let sum%=2`;then echo -ne "\033[41m \033[0m" else echo -ne "\033[42m \033[0m" fi let j-- done echo let i-- done
until循環
until CONDITION; do 循環體 done
進入條件:CONDITION為false
退出條件:CONDITION為true
用于循環體中
循環控制語句continue
continue [N]
提前結束N層循環,而直接進入當前層+N層的循環進行條件判斷;不寫默認為跳過本次循環
while CONDTIITON1; do CMD1 ... if CONDITION2; then continue fi CMDn ... done
循環控制語句break
break [N]
提前跳出N層循環,不寫默認為跳出當前循環
while CONDTIITON1; do CMD1 ... if CONDITION2; then break fi CMDn ... done
創建無限循環
while true; do 循環體 doneuntil false; do 循環體 Done
一、用until實現下列作業
1、每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶hacker登錄,則將登錄時間和主機記錄于日志/var/log/login.log
#!/bin/bash #description #version 0.1 #author gaomeng #date 20160816 read -p "please one username: " user until who | grep "^$user\>" &> /dev/null ;do sleep 3 done echo "$user is logining system." logintime=`date +%F-%T` host_ip=`who | grep "^$user\>" | cut -d"(" -f2 | cut -d")" -f1` echo "$user is login on $host_ip,time is $logintime." >> /var/log/login.log ttynum=`who | grep "^$user\>" | tr -s ' '| cut -d' ' -f2` until ! who | grep "^$user\>" &> /dev/null ;do echo "please logout system." > /dev/$ttynum sleep 1 done echo "$user is logout system."
第1個root終端 [root@CentOS6 ~]# who root pts/0 2016-08-17 17:46 (10.1.250.25) root pts/1 2016-08-17 18:15 (10.1.250.25) [root@CentOS6 bin]# untillogin.sh please one username: gao gao is logining system. gao is logout system. 第2個root終端: [root@CentOS6 ~]# who root pts/0 2016-08-17 17:46 (10.1.250.25) root pts/1 2016-08-17 18:15 (10.1.250.25) gao pts/2 2016-08-17 18:15 (10.1.250.25) [root@CentOS6 ~]# who root pts/0 2016-08-17 17:46 (10.1.250.25) root pts/1 2016-08-17 18:15 (10.1.250.25)
普通用戶終端
2、隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出
#!/bin/bash #description #version 0.1 #author gaomeng #date 20160816 real_num=$[$RANDOM%10] read -p "please one number on 1 to 10: " num until [ $num -eq $real_num ] ;do if [ $num -gt $real_num ] ;then echo "your number > realnum." else echo "your number < realnum." fi read -p "please one number on 1 to 10: " num done echo "you are good."
[root@CentOS6 bin]# until2.sh please one number on 1 to 10: 5 your number < realnum. please one number on 1 to 10: 8 your number > realnum. please one number on 1 to 10: 6 you are good.
3、編寫腳本,求100以內所有正整數之和
#!/bin/bash #description sum 1 to 100 #version 0.1 #author gaomeng #date 20160816 i=100 until [ $i -eq 0 ] ; do let sum+=i let i-- done echo "1 to 100 sum=$sum"
[root@CentOS6 bin]# until1-100.sh 1 to 100 sum=5050
4、編寫腳本,通過ping命令探測10.1.252.1-254范圍內的所有主機的在線狀態,統計在線主機和離線主機各多少。
#!/bin/bash #description ping network ip #version 0.1 #author gaomeng #date 20160816 ip=`echo $1 | cut -d. -f1-3` i=254 until [ $i -eq 0 ]; do ping -c1 -w1 $ip.$i &> /dev/null && let up-ip++ let i-- done let down-ip=254-upip echo "up host is $up-ip. down host is $down-ip"
[root@CentOS6 bin]# untilping.sh 10.1.252.0 up host is 23. down host is 231
5、編寫腳本,打印九九乘法表
#!/bin/bash #description Input 9*9 #version 0.1 #author gaomeng #date 20160816 i=1 until [ $i -eq 10 ]; do j=1 until [ $j -gt $i ];do echo -en "$j*$i=$[$i*$j]\t" let j++ done echo let i++ done
[root@CentOS6 ~]# until9and9.sh 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
6、編寫腳本,利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者
#!/bin/bash #description random 10 number, Input max number and min number #version 0.1 #author gaomeng #date 20160816 max=$RANDOM min=$max i=9 echo "RANDOM 10 number is:" echo "$max" until [ $i -eq 0 ];do num=$RANDOM echo "$num" if [ $num -gt $max ]; then max=$num elif [ $num -lt $min ]; then min=$num fi let i-- done echo "max number is: $max . min number is $min ."
[root@CentOS6 ~]# untilrandom.sh RANDOM 10 number is: 23336 10054 3863 28020 25654 8438 31203 14681 15475 22924 max number is: 31203 . min number is 3863 .
7、編寫腳本,實現打印國際象棋棋盤
#!/bin/bash #description Input chess #version 0.1 #author goameng #date 20160816 i=8 until [ $i -eq 0 ];do j=8 until [ $j -eq 0 ];do sum=$[i+j] if `let sum%=2` ;then echo -en "\033[41m \033[0m" else echo -en "\033[42m \033[0m" fi let j-- done echo let i-- done
8、打印等腰三角形
#!/bin/bash #description #version 0.1 #author gaomeng #date 20160816 read -p "please input line number: " sumline line=1 num=$sumline until [ $num -eq 0 ] ;do num1=$[sumline-line] until [ $num1 -eq 0 ]; do echo -n " " let num1-- done num2=$[2*line-1] until [ $num2 -eq 0 ]; do echo -n "*" let num2-- done echo let line++ let num-- done line=$[sumline-1] num=$[sumline-1] until [ $num -eq 0 ] ;do num1=$[sumline-line] until [ $num1 -eq 0 ]; do echo -n " " let num1-- done num2=$[2*line-1] until [ $num2 -eq 0 ]; do echo -n "*" let num2-- done echo let line-- let num-- done
[root@CentOS6 bin]# until3.sh please input line number: 4 * *** ***** ******* ***** *** * [root@CentOS6 bin]# until3.sh please input line number: 7 * *** ***** ******* ********* *********** ************* *********** ********* ******* ***** *** *
9、安裝centos6.7,用centos6.8kernel升級
原內核:
[root@CentOS6 ~]# uname -r 2.6.32-642.el6.x86_64
下載kernel鏡像:
[root@CentOS6 ~]# lftps cd ok, cwd=/pub lftp 10.1.0.1:/pub> cd Sources/6.x86_64/kernel(CentOS6.5)/ lftp 10.1.0.1:/pub/Sources/6.x86_64/kernel(CentOS6.5)> ls -rwxr--r-- 1 500 500 29038424 Nov 24 2013 kernel-2.6.32-431.el6.x86_64.rpm -rwxr--r-- 1 500 500 2235524 Nov 24 2013 kernel-abi-whitelists-2.6.32-431.el6.noarch.rpm -rwxr--r-- 1 500 500 9167492 Nov 24 2013 kernel-devel-2.6.32-431.el6.x86_64.rpm -rwxr--r-- 1 500 500 11015536 Nov 24 2013 kernel-doc-2.6.32-431.el6.noarch.rpm -rwxr--r-- 1 500 500 13601072 Nov 24 2013 kernel-firmware-2.6.32-431.el6.noarch.rpm -rwxr--r-- 1 500 500 2970072 Nov 24 2013 kernel-headers-2.6.32-431.el6.x86_64.rpm lftp 10.1.0.1:/pub/Sources/6.x86_64/kernel(CentOS6.5)> get kernel-2.6.32-431.el6.x86_64.rpm 29038424 bytes transferred in 2 seconds (11.13M/s) lftp 10.1.0.1:/pub/Sources/6.x86_64/kernel(CentOS6.5)> bye
安裝kernel:
[root@CentOS6 ~]# rpm -ivh --force kernel-2.6.32-431.el6.x86_64.rpm Preparing... ########################################### [100%] 1:kernel ########################################### [100%]
重啟電腦:
安裝成功,多個內核可以在啟動時選擇
原創文章,作者:megedugao,如若轉載,請注明出處:http://www.www58058.com/36923