"if"文の最も移植性の高い構文は何ですか?

(注:はい非常に似た質問、昨日は奇妙だと尋ねましたが、私は興味のある主な構文を扱いません。これを含むように他の質問を更新すると、回答が無効になる可能性があるため、ここでは他の質問から欠落している内容に焦点を当てます。全体像を見たい人は、誰もがこれら2つの質問とそれに対する答えを見なければなりません。 )

私は通常、ifステートメントを次のように書いています。

if [[ -z "$SOMETHING" ]]; then
  # blah blah blah
fi

これはBashとZシェルで私にうまくいきましたが、最近角かっこを完全に削除する構文:

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まさにそれだからです。 (関数、シェル組み込み、または実行可能1の場合がありますこの実行時に使用された引数と入力を返すif場合は、いくつかの操作を実行してください。some-command0

if [ ]or if [[ ]]、andを実行すると、[ ]条件付きテストがtrueの場合は[[ ]]プログラムまたはシェル組み込みが返されます。に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

参考にしてください化合物一覧とは違う複合コマンド

おすすめ記事