「if」語句最可移植的語法是什麼?

「if」語句最可移植的語法是什麼?

(註:有一個非常相似的問題,昨天問得很奇怪,但它沒有涵蓋我關心的主要語法。如果我要更新另一個問題以包含它們,可能會使答案不再有效,所以我將在這裡重點關注另一個問題中遺漏的內容。任何想要了解全貌的人都應該看看這兩個問題及其接受的答案。

我通常將 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

請注意,一個化合物列表與 a 不一樣複合命令

相關內容