`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

括弧なしのバージョンは移植可能か?提示されたオプションと比べてどうか?ここ?

[[ -w /home/durrantm ]] && echo "writable"私の標準バージョンは主に Bash と Z Shell (他の質問で言及されているバージョンのように) でのみサポートされていますか?

答え1

はい、リンク先の質問で指摘されているように、標準バージョンは POSIX 標準ではありません。ただし、次のようになります。

if some-command args; then ...

これが の唯一の移植可能な形式であると私は言います。ifなぜなら、これが のifすべてだからです。(関数、シェル組み込み、または実行可能ファイル1のいずれか)が、実行時に使用された引数と入力に対してを返すif場合、 は何かを行います。some-command0

if [ ]または を実行するとif [[ ]][ ]および は条件が真の場合に[[ ]]を返すプログラムまたはシェル組み込み関数です。を に変換すると、常に括弧なしの形式が実行されていることがわかります。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

注意:複合リストは同じではありません複合コマンド

関連情報