1. 程式人生 > >linux 循環結構中的 break continue exit return區別

linux 循環結構中的 break continue exit return區別

break continue exit

1 概述

在腳本的循環中,需要用到break,continue,exit.來控制循環。利用return來獲取函數的返回值。本文將對這四個命令的使用做介紹

break [N]:提前結束第N層循環,最內層為第1層

continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層

exit 命令終止腳本

2 break continue exit 對比

2.1 break 和continue 測試

假設一個循環體內,總共嵌套了3層循環,總循環體N為3,break 和continue要退出的層數為n

為了方便做測試對比,將continue和break和exit都被寫入在最裏層的循環體內,即循環體1內

最外層循環為3

第二層循環為2

最裏層循環為1

測試方法:一個一個測試,先註釋掉其他兩個

步驟一:測試break,則將continue和exit都註釋,依次增大break n中n的數值,從1到n,n最終大於3

步驟二:測試continue,則將break,和exit都註釋,依次增大continue n中n的數值,從1到n,n最終大於3

步驟三:對比步驟一和二的結果

測試結果如下,

continue 1,結束這次的子循環條件,退出到同一層的循環,即1層來繼續下一個條件的循環

break 1 結束這一層的循環,退出到上一層(3-1層),即第2層循環,繼續執行第2層循環的下一個條件的循環

continue 2,這個條件等價於break 1

break 2 結束兩層循環,退出到上一層的上一層循環(3-2層),即第1層循環,繼續執行第1層循環的下一個條件的循環

continue 3,這個條件等價於break 2

break 3,結束三層循環,即退出3個循環體,繼續往下執行循環體下面的腳本。

註意,當退出的循環體的數量N大於3,此時得到的結果

continue N 得到的結果和continue 3一樣;

break N 得到的結果和break 3一樣;

總結:N為所有循環體最外層層數,當退出循環的層數n為 1<n<N,continue n 等價於 break n-1,

當n=1或者n=N;continue 和break 執行效果不一樣

當n>N,其實沒有實際的執行效果,因為本身沒有那麽多層的循環體可以退出

2.2 exit 測試

exit X ;一旦執行到exit,則直接退出整個腳本的運行,這裏的X不作為退出層數,只作為退出函數後$?的值

如設置

 exit 6

當循環執行到這個語句時,直接退出所有的腳本,而且此時$?的值為6

2.3 腳本

#!/bin/bash
#
#******************************************************************************
#Author:               Sunny
#Date:                 2017-09-01
#FileName:             Tbreak_con_exit.sh
#version:              1.0
#Your change info:     
#Description:          For testing break continue and exit
#Copyright(C):         2017  All rihts reserved
#*****************************************************************************
for ((m=1;m<3;m++))
do
    for ((j=1;j<5;j++));do
        for ((i=1;i<5;i++ ))
        do  
        if [ $i -eq 3 ] 
        then
            break 4
        #continue 3
        #exit 6
        fi  
        echo "the m cycle is $m the out cycle is $j,and inner cycle is $i"
        done
    done
done

if [ $j -eq 1 ];then
echo "now it will exit, the m:j:i cycle is $m: $j : $i"
else
echo "now it will exit, the m:j:i cycle is $[ $m-1 ]: $[ $j-1 ] : $[ $i-1 ]"
fi


3 return

return這個是一個內置的命令,只能在函數或者是執行 source 腳本 裏被識別

return後面必須是跟數字

3.1 測試函數裏的return n

當函數遇到return n 的時候,就會默認函數結束,而n的值就是整個函數執行結果的返回值,這個返回值如果是0,表示函數運行結果是正確的,如果是1-255表示執行的結果是錯誤的。

測試方法:通過調整return n的n值, n 範圍是[0,255]

結果如下:

當n=0,則調用函數get_version 後會執行代碼 { echo "\$?=$?;RRC1=$?"; }

當n != 0,則調用函數get_version 後會執行代碼 { echo "\$?=$?;WRC2=$?"; }

其中

RC1會把賦值為0,因為此時的$?是執行獲得版本信息os_version得到的返回值,這個命令執行結果是正確的,所以返回0值

RC2不會被賦值,因為RC2前面已經有return n;函數執行到return n已經結束,所以RC2 不被賦值

腳本如下:

#!/bin/bash
#
#******************************************************************************
#Author:               Sunny
#Date:                 2017-09-01
#FileName:             Treturn.sh
#version:              1.0
#Your change info:     
#Description:          For
#Copyright(C):         2017  All rihts reserved
#*****************************************************************************
get_version() {
    os_version=`cat /etc/system-release | grep -o " [0-9]"| cut -d " " -f2` && { RC1=$?;return 2;RC2=$?; }

    }   
get_version && { echo "\$?=$?;RRC1=$?"; } || { echo "\$?=$?;WRC2=$?"; }
echo version=$os_version
echo RC1=$RC1
echo RC2=$RC2

3.2 測試source 腳本的return n

在執行 source 腳本 ,如果遇到 return n表示整個腳本執行結束,而n值作為腳本結束的返回值

測試方法:通過註釋掉 os_version來查看當腳本裏有沒有return n後面的語句是否會執行

結果如下:

當有return n的時候,return n後的命令不在被執行,說明已經退出腳本

當沒有return n的時候,return n後的命令依然被執行

#!/bin/bash
#
#******************************************************************************
#Author:               Sunny
#Date:                 2017-09-01
#FileName:             trc.sh
#version:              1.0
#Your change info:     
#Description:          For  test the functioon of return used in script
#Copyright(C):         2017  All rihts reserved
#*****************************************************************************
echo RC1=$RC1
echo RC2=$RC2
echo \$?=$?
os_version=`cat /etc/system-release | grep -o " [0-9]"| cut -d " " -f2` && { RC1=$?;return 6;RC2=$?; }
#os_version=`cat /etc/system-release | grep -o " [0-9]"| cut -d " " -f2` && { RC1=$?;RC2=$?; }
ls
pwd
echo RC1=$RC1
echo RC2=$RC2
echo \$?=$?

4 總結

break和continue都是用來控制循環體

exit 直接退出腳本執行

return是用來返回函數的執行結果

當用source 腳本 來執行腳本的時候,return會把識別,此時的return可以返回整個腳本的執行結果


本文出自 “自學linux” 博客,請務必保留此出處http://ghbsunny.blog.51cto.com/7759574/1962255

linux 循環結構中的 break continue exit return區別