條件執行命令列表
如何使用命令列表的條件執行
任何內建命令,表示式或函式,以及任何外部命令或指令碼都可以使用 &&
(和) 和||
(或) 運算子有條件地執行。
例如,如果 cd
命令成功,則僅列印當前目錄。
cd my_directory && pwd
同樣,如果 cd
命令失敗,這將退出,防止災難:
cd my_directory || exit
rm -rf *
當以這種方式組合多個語句時,重要的是要記住(與許多 C 風格的語言不同) 這些運算子沒有優先權並且是左關聯的 。
因此,此宣告將按預期工作……
cd my_directory && pwd || echo "No such directory"
- 如果
cd
成功,則執行&& pwd
並列印當前工作目錄名稱。除非pwd
失敗(罕見),否則|| echo ...
將不會被執行。 - 如果
cd
失敗,將跳過&& pwd
並執行|| echo ...
。
但這不會(如果你想到的話)……
cd my_directory && ls || echo "No such directory"
- 如果
cd
失敗,則跳過&& ls
並執行|| echo ...
。 - 如果
cd
成功,則執行&& ls
。-
如果
ls
成功,則忽略|| echo ...
。 (到現在為止還挺好) -
但是……如果
ls
失敗,|| echo ...
也將被執行。它是
ls
,而不是cd
,這是前一個命令。
-
為什麼使用命令列表的條件執行
條件執行比 if...then
更快,但它的主要優點是允許函式和指令碼提前退出或短路。
與像 C
這樣的許多語言不同,其中記憶體被明確地分配給結構和變數等(因此必須被釋放),bash
處理這個問題。在大多數情況下,我們不必在離開功能之前清理任何東西。return
語句將釋放函式本地的所有內容以及堆疊返回地址處的拾取執行。
儘快從函式返回或退出指令碼可以通過避免不必要的程式碼執行來顯著提高效能並減少系統負載。例如…
my_function () {
### ALWAYS CHECK THE RETURN CODE
# one argument required. "" evaluates to false(1)
[[ "$1" ]] || return 1
# work with the argument. exit on failure
do_something_with "$1" || return 1
do_something_else || return 1
# Success! no failures detected, or we wouldn't be here
return 0
}