linux 循環結構中的 break continue exit return區別
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區別