I found

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

in /etc/default/lxc on Ubuntu 16.04 which seems to be replacing (my own or package maintainer code)

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

Since the test is counter-intuitive (in case of failure of the test about non-presence of the file run the command) I was wondering if it has any advantage over the &&-version.


Yes, if you care about the exit code of the compound statement. Try the following:


! $1 || true
echo $?

$1 && true
echo $?

then run it with true and false as arguments.

./script true

./script false

This is because short-circuit evaluation of boolean expressions.

In OP's example, let's suppose the file doesn't exist:

  • In the first case, the first condition returns TRUE, no need to evaluate the second operation (TRUE OR x = TRUE). You get a TRUE for the compound statement.
  • In the second case, the first condition returns FALSE, no need to evaluate the second operation (FALSE AND x = FALSE). You get a FALSE for the compound statement.

Exit codes are very important. Check this SO answer to see possible implications of set -e, trap and set -o pipefail.

  • 3
    You might want to point to the -e option as one reason one might well care very much about exit codes. – JdeBP May 17 '16 at 15:22
  • @JdeBP: In stackoverflow.com/questions/19622198/…, the most accepted answer is to use trap instead of set -e. Besides that, there is the recommendation of also setting set -o pipefail. – mmoya May 17 '16 at 15:54

[ -f file ] is true when file exists and is a plain file.

[ ! -f file ] is true when file does not exist or is another file type.

So there is no real difference - except for readability.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.