
(注:非常に似た質問奇妙なことに、昨日質問されたのですが、私が関心のある主要な構文はカバーされていません。他の質問を更新してそれらを含めると、回答が有効でなくなる可能性があるため、ここでは他の質問で見逃されていた点に焦点を当てます。全体像を知りたい人は、両方の質問と受け入れられた回答を確認してください。
私は通常、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-command
0
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