
(註:有一個非常相似的問題,昨天問得很奇怪,但它沒有涵蓋我關心的主要語法。如果我要更新另一個問題以包含它們,可能會使答案不再有效,所以我將在這裡重點關注另一個問題中遺漏的內容。任何想要了解全貌的人都應該看看這兩個問題及其接受的答案。
我通常將 if 語句寫成如下:
if [[ -z "$SOMETHING" ]]; then
# blah blah blah
fi
這對我來說在 Bash 和 Z Shell 下工作得很好,但我最近遇到了完全刪除方括號的語法:
if command -v given-command > /dev/null 2>&1; then
echo given-command is available
else
echo given-command is not available
fi
不帶括號的版本可以移植嗎?與所提供的選項相比如何這裡?
我的標準版本主要僅在 Bash 和 Z Shell 上支援(就像[[ -w /home/durrantm ]] && echo "writable"
其他問題中提到的版本一樣)嗎?
答案1
是的,您的標準版本不是 POSIX 標準,正如您連結到註釋的問題一樣。然而,以下情況是:
if some-command args; then ...
我想說這是唯一可移植的形式if
,因為這就是if
全部。if
如果some-command
(可以是函數、shell 內建函數或可執行檔1)返回0
運行時使用的參數和輸入,則執行某些操作。
當您執行if [ ]
或if [[ ]]
、[ ]
和時,如果條件測試為真,則[[ ]]
程式或 shell 內建指令將會傳回。0
如果您轉換[
為test
,您會發現您始終運行不帶括號的表單:
if [ ... ]
# same as
if /bin/test ...
1更準確地說,讓我們看看如何if
構建被定義為:
這如果命令應執行複合列表並使用其退出狀態來確定是否執行另一個複合列表。
的格式為如果構造如下:
if compound-list then compound-list [elif compound-list then compound-list] ... [else compound-list] fi