是否有理由使用“[ ! -f file ] || command”而不是“[ -f file ] && command”?

是否有理由使用“[ ! -f file ] || command”而不是“[ -f file ] && command”?

我發現

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

/etc/default/lxcUbuntu 16.04 上,它似乎正在替換(我自己的或套件維護者代碼)

[ -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,無需評估第二個操作 ( TRUE OR x = TRUE)。複合語句的結果為 TRUE。
  • 在第二種情況下,第一個條件傳回 FALSE,無需計算第二個操作 ( FALSE AND x = FALSE)。複合語句的結果為 FALSE。

退出代碼非常重要。查看set -e 在 bash 腳本中意味著什麼?查看set -etrap和的可能意義set -o pipefail

答案2

[ -f file ]file存在時為 true是一個plain file.

[ ! -f file ]file不存在時為 true或者是另一種文件類型。

因此,除了可讀性之外,沒有真正的區別。

相關內容