Shell腳本編程 流程控制—循環

循環:重復執行所指定的代碼片段,直到循環條件不滿足,則退出循環

一、for循環

    語法格式:

    for 變量名 in 列表

    do

        循環體

    done

    for循環運行格式,依次將列表中的元素賦值給變量名,而后執行一次循環體,直到列表中的元素耗盡 則退出循環

    列表的生成:

        1.直接給出列表

        2.整數列表:seq 1 n或{1..100}

        3.命令引用

        4.變量引用

[root@CentOS6 ~]# cat for.sh 
#!/bin/bash
#
for I in {1..10}
do
echo $I
done
[root@CentOS6 ~]# bash for.sh 
1
2
3
4
5
6
7
8
9
10
[root@CentOS6 ~]#

for特殊用法:

    for ((控制變量初始值;條件判斷表達式;修正表達式))

    do

        循環體

    done

    循環之前判斷條件表達式是否成立,如果成立,則執行一次循環體,然后執行修正表達式做修正,再吃判斷條件表達式是否成,成立則循環,否則退出

    

[root@CentOS6 ~]# cat for.sh 
#!/bin/bash
#
for ((I=1;I<=10;I++))
do
echo $I
done
[root@CentOS6 ~]# bash for.sh 
1
2
3
4
5
6
7
8
9
10
[root@CentOS6 ~]#

for創建死循環:

    for ((;1;))

    do

      echo "hello"

    done

    無限輸出hello,按Ctrl+c退出循環

    

二、while循環

    語法格式:

    while CONDITION

    do    

        循環體

    done

    在做循環之前CONDITION是否成立,如果條件成立,執行一次循環體,直到條件不滿足為止,因此,在循環體中我們一般會對CONDITION做修正

    進入條件:CONDITION為true

    退出條件:CONDITION為false

[root@CentOS6 ~]# cat while1.sh 
#!/bin/bash
#
declare -i I=1
while [ $I -le 10 ]
do
echo $I
let I++
done
[root@CentOS6 ~]# bash while1.sh 
1
2
3
4
5
6
7
8
9
10
[root@CentOS6 ~]#

    while特殊用法:

    while read 變量名

    do   

        循環體

    done < /PATH/TO/SOMEFILE

    依次讀取SOMEFILE文件中的每一行,并賦值給所指定的變量,而后執行循環體

    我們在處理文本文件時經常會用到這種格式

    

[root@CentOS6 ~]# cat whilefile.sh     顯示/root/for.sh文件中的每一行
#!/bin/bash
#
while read LINE
do
echo $LINE
done < /root/for.sh
[root@CentOS6 ~]# bash whilefile.sh 
#!/bin/bash
#
for ((;1;))
do
echo "hello"
done
[root@CentOS6 ~]#

    while死循環:

    while true

    do

        循環體

    done

    條件測試語句永久為真,循環體將永久執行,按Ctrl+c退出循環

三、until循環

    語法格式:

    until CONDITION

    do

        循環體

    done

    循環之前判斷CONDITION是否為假,如果為假,執行一次循環體,直至CONDITION為真結束循環

    進入條件:CONDITION為假

    退出條件:CONDITION為真

    

[root@CentOS6 ~]# cat until.sh     #打印1到10之間的整數
#!/bin/bash
#
declare -i I=1

until [ $I -gt 10 ]
do
    echo $I
    let I++
done
[root@CentOS6 ~]# bash until.sh 
1
2
3
4
5
6
7
8
9
10
[root@CentOS6 ~]#

    until創建死循環

    until false

    do

        循環體

    done

    CONDITION條件永久為假,循環體永久執行,按Ctrl+c停止循環

循環控制語句:

    continue:當滿足一定條件時,提前結束第N層的循環,而直接進入下一次循環判斷

    break:當滿足一定條件時,提前結束第N層循環

下面我們來做幾個示例:

1.添加user1-user10是個用戶密碼同用戶名

[root@CentOS6 ~]# cat user.sh 
#!/bin/bash
#
for I in $(seq 1 10)
do
    if ! id user$I &> /dev/null;then
        useradd user$I
        echo user$I:user$I | chpasswd
        echo "Add user$I finishd."
    else
        echo "user$I exists."
    fi
done
[root@CentOS6 ~]# bash user.sh     #添加10個用戶完成
Add user1 finishd.
Add user2 finishd.
Add user3 finishd.
Add user4 finishd.
Add user5 finishd.
Add user6 finishd.
Add user7 finishd.
Add user8 finishd.
Add user9 finishd.
Add user10 finishd.
[root@CentOS6 ~]# bash user.sh     #如果用戶已添加,則顯示用戶已經存在
user1 exists.
user2 exists.
user3 exists.
user4 exists.
user5 exists.
user6 exists.
user7 exists.
user8 exists.
user9 exists.
user10 exists.
[root@CentOS6 ~]#

2.編寫腳本,測試10.1.252.1-254所有主機在線狀態

[root@CentOS6 ~]# cat ip.sh 
#!/bin/bash
#

echo "測試10.1.252.1-254所有主機在線狀態"
NETWORK="10.1.252."
Red="\033[31m"
Green="\033[32m"
End="\033[0m"
declare -i UP=0
declare -i DOWN=0
for I in $(echo ${NETWORK}{1..254})
do
    if ping -c 1 -W 1 $I &> /dev/null;then
        echo -e "${Green}$I IP is up.$End"
        echo $I >> /root/up.txt
        let UP++
    else
        echo -e "${Red}$I IP is down.$End"
        echo $I >> /root/down.txt
        let DOWN++
    fi
done
echo "host up is $UP."
echo "host down is $DOWN."
[root@CentOS6 ~]# 
[root@CentOS6 ~]# bash ip.sh 
測試10.1.252.1-254所有主機在線狀態
10.1.252.1 IP is down.
10.1.252.2 IP is down.
10.1.252.3 IP is down.
10.1.252.4 IP is down.
10.1.252.5 IP is down.
10.1.252.6 IP is down.
10.1.252.7 IP is up.
10.1.252.8 IP is down.
...

3.打印99乘法表

[root@CentOS6 ~]# cat 99.sh 
#!/bin/bash
#

for I in $(seq 1 9)
do
	for J in $(seq 1 $I)
	do
		echo -n -e "${J}X${I}=$[${J}*${I}]\t"
	done
	echo
done
[root@CentOS6 ~]# bash 99.sh 
1X1=1	
1X2=2	2X2=4	
1X3=3	2X3=6	3X3=9	
1X4=4	2X4=8	3X4=12	4X4=16	
1X5=5	2X5=10	3X5=15	4X5=20	5X5=25	
1X6=6	2X6=12	3X6=18	4X6=24	5X6=30	6X6=36	
1X7=7	2X7=14	3X7=21	4X7=28	5X7=35	6X7=42	7X7=49	
1X8=8	2X8=16	3X8=24	4X8=32	5X8=40	6X8=48	7X8=56	8X8=64	
1X9=9	2X9=18	3X9=27	4X9=36	5X9=45	6X9=54	7X9=63	8X9=72	9X9=81	
[root@CentOS6 ~]#

4.打印nn金字塔

[root@CentOS7 bin]# cat jinzita.sh 
#!/bin/bash
#

read -p "請輸入要打印的行數:" INT

for ((LINES=1;LINES<=INT;LINES++))
do
	for ((Space=0;Space<=$[$INT-$LINES];Space++))
	do
		echo -n " "
	done

	for ((Xing=1;Xing<=$[$LINES*2-1];Xing++))
	do
		echo -n -e "\033[31m*\033[0m"
	done
	echo
done
[root@CentOS7 bin]# bash jinzita.sh 
請輸入要打印的行數:10
          *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************
[root@CentOS7 bin]#

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

(0)
zhai796898zhai796898
上一篇 2016-08-24 11:20
下一篇 2016-08-24 19:02

相關推薦

  • 開篇

    test 新人報道

    Linux干貨 2016-10-28
  • 命令組合實戰

    1 列出/etc/下以。conf結尾的文件 [redsun@jiange root]$ ls  /etc/*.conf | tr 'a-z' 'A-Z'  | sed 's/ETC/etc/' > /tmp/etc.conf [redsun@jiange root]$ mo…

    Linux干貨 2016-11-13
  • 腳本之循環的特殊用法及函數的使用

    一、本文主要時針對while for select循環結果的特殊用法進行講解。     1、while循環的特殊用法                 while read…

    Linux干貨 2016-08-21
  • 第七周作業

    1、創建一個10G分區,并格式為ext4文件系統;   (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;   (2) 掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳; [root@localhost ~]# fdis…

    Linux干貨 2017-07-04
  • root用戶密碼破解

    方法一:進入單用戶模式破解root密碼 (1)編輯grub菜單(選定要編輯的title,而后使用e命令) (2)在選定的kernel后附加 1,s,S或single都可以 (3)在kernel所在行鍵入"b"命令即可進入單用戶模式 (4)運行passwd命令修改root用戶密碼 并重啟 (5)輸入密碼即可登錄 方法二:進入救援?!?/p>

    Linux干貨 2016-09-15
  • 查找find及壓縮與解壓

    find  根據時間戳:以“天”為單位;              -atime [+|-]#,                #: [#,#+1)   2 那就是大于等于二天小于…

    2017-08-12
欧美性久久久久