"[ -f file ] && command" の代わりに "[ ! -f file ] || command" を使用する理由はありますか?

"[ -f file ] && command" の代わりに "[ ! -f file ] || command" を使用する理由はありますか?

私は見つけた

[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net

Ubuntu 16.04では、/etc/default/lxc(自分のコードまたはパッケージメンテナーのコードを)置き換えているようです。

[ -f /etc/default/lxc-net ] && . /etc/default/lxc-net

このテストは直感に反するものなので (ファイルが存在しないというテストが失敗した場合はコマンドを実行します)、&&-version に比べて何か利点があるかどうか疑問に思いました。

答え1

はい、もしあなたが複合文の終了コード次の手順を試してください。

#! /bin/sh -

! "$@" || true
echo "$?"

"$@" && true
echo "$?"

次に、trueと をfalse引数として実行します。

./script true
0
0

./script false
0
1

それの訳は短絡評価ブール式の。

OPの例では、ファイルが存在しません:

  • 最初のケースでは、最初の条件が TRUE を返すため、2 番目の演算 ( TRUE OR x = TRUE) を評価する必要はありません。複合ステートメントに対して TRUE が返されます。
  • 2 番目のケースでは、最初の条件が FALSE を返すため、2 番目の演算 ( FALSE AND x = FALSE) を評価する必要はありません。複合ステートメントでは FALSE が返されます。

終了コードは非常に重要です。bash スクリプトで set -e はどういう意味ですか?set -etrapおよびの考えられる意味を確認しますset -o pipefail

答え2

[ -f file ]file存在する場合は真ですそしては ですplain file

[ ! -f file ]file存在しない場合は真であるまたは別のファイルタイプです。

したがって、読みやすさを除けば、実際の違いはありません。

関連情報