shell腳本3——循環語句

流程控制:

     順序執行

     選擇執行

     循環執行

循環執行:

     將某代碼段重復運行多次

     重復運行多少次:

     循環次數事先已知

     循環次數事先未知

     有進入條件和退出條件


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

1.png

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
    循環體
done

until 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.png

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

3.png

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%]

重啟電腦:

5.png  

安裝成功,多個內核可以在啟動時選擇

原創文章,作者:megedugao,如若轉載,請注明出處:http://www.www58058.com/36923

(0)
megedugaomegedugao
上一篇 2016-08-18
下一篇 2016-08-18

相關推薦

  • vim編輯器

    回顧:     正則表達式(BRE, ERE)     BRE:字符匹配:., [], [^]     次數匹配:*,\?,\+,\{m\},\{m,n}     位置錨定:^,$,\<,\>     分組及引用:(),\1,\2,…&…

    Linux干貨 2016-12-23
  • N_28 正則表達式的一些基本用法

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 ~]# cp -r /etc/skel /home/tuser1 ~]# chmod -R -g— -o— /home/tuser1 2、編輯/etc/group文件,添加組hadoop。 ~]#vi…

    Linux干貨 2017-12-23
  • M25初嘗試部署RAID磁盤陣列組

    在學習了linux系統管理硬盤設備的基礎后,現在嘗試部署RAID10硬盤組技術,在部署前我們先了解一下什么叫“RAID”磁盤冗余陣列(Redundant Array of Independent Disks)。 RAID技術就是把多塊硬盤設備組合成一個容量更大、更安全的硬盤組,可以把數據切割成多個區段后分別存在各個不同物理硬盤設備上,然后利用分散讀寫需求賴提…

    2017-07-12
  • 正則表達式應用

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。    cp -a /etc/skel /home/tuser1    chmod g-x /home/tuser1…

    Linux干貨 2016-12-24
  • N23_第六周

    1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#;:%s/^[[:blank:]]\+.*/\0#/g 2、復制/boot/grub/grub.conf至/tmp目錄中,刪除/tmp/grub.conf文件中的行首的空白字符;:%s/^[[:space:]]\+/…

    Linux干貨 2017-02-28
  • 壓縮和解壓縮總結

                      壓縮和解壓縮的命令很多,今天總結如下: gzip  壓縮比1–9  默認是6  壓縮比越高  耗費CPU資源也多,文件比較小的話,不建議使用gzip壓縮,因為使用gzip越壓縮越大。…

    Linux干貨 2017-04-17
欧美性久久久久