在Shell腳本中,往往會遇到一些判斷類型為某個值不符合預期值的時候就退出主腳本/當前腳本/當前函數,那么Exit與return的用法與區別是什么呢?
下面先使用Exit舉個簡單例子,腳本內容如下
#!/bin/bash
if [[ "$1" == "1" ]];then
echo "your input is $1"
else
echo '退出'
exit 0
fi
echo '最后一句'
第一種執行方法:
使用Shell解析器進行調用,結果如下
首先是BASH
然后是sh
接着是dash
從上面的反饋結果來看,三個Shell解析器只有BASH能夠無報錯的執行完成,其他的則會提示語法錯誤,所以從這點可以看出:
雖然都是Shell解析器,但是他們都有自己的標准,在大體上保持一致,但是某些細節上則會出現差異。
那么下面繼續見證另外三種執行方法
第一種:.
第二種:source
第三種:./
從上面所有案例可以得出一個不夠嚴謹的結論(因為當前終端默認解析器就是BASH),所以出現了解析器調用法的時候,只有BASH能完美解析腳本,其他解析器都水土不服。
在后面三種執行方法中,全部都順利完成解析,但是這並不代表它們都一樣,下面開始演示它們的區別(腳本內容增加一段)。
下面的演示需要關注的重點是當前用戶,具體請看演示:
腳本內容更新如下:
當前用戶如下:
開始演示,下面的演示與之前演示的區別在於第一參數的改變。
第一個,依舊是BASH調用
從反饋結果看,此時用戶名變量不變
然后跳過其他Shell解析器調用的測試,直接從.開始
這時候可以看出,使用.的時候,遇到Exit的指令時,該指令會直接應用到當前終端環境,相當於在當前終端執行EXit的指令,接下來繼續看其他方式
結果依舊,然后繼續使用./的方式
這時候,結果與BASH解析器調用的結果一致,那么從這個結果中我們又可以得出一個結論:
當腳本作為解析器調用文件的時候,此時整個腳本內容產生的效果之后應用於解析器調用的進程里,而不是當前終端環境,當使用source和一個.的方法執行的時候,腳本內容會直接對當前終端生效,而不是某個應用進程。雖然這是一個小小的區別,但卻是一個非常實用的功能。