![是否有理由使用“[ ! -f file ] || command”而不是“[ -f file ] && command”?](https://rvso.com/image/88490/%E6%98%AF%E5%90%A6%E6%9C%89%E7%90%86%E7%94%B1%E4%BD%BF%E7%94%A8%E2%80%9C%5B%20!%20-f%20file%20%5D%20%7C%7C%20command%E2%80%9D%E8%80%8C%E4%B8%8D%E6%98%AF%E2%80%9C%5B%20-f%20file%20%5D%20%26%26%20command%E2%80%9D%EF%BC%9F.png)
我發現
[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net
在/etc/default/lxc
Ubuntu 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 -e
、trap
和的可能意義set -o pipefail
。
答案2
[ -f file ]
file
存在時為 true和是一個plain file
.
[ ! -f file ]
file
不存在時為 true或者是另一種文件類型。
因此,除了可讀性之外,沒有真正的區別。