The short-circuiting in bash

Bash script writing is a import approach to configure the linux system. Suppose we wish to add a user if not exists, the command may seems as follow:

TARGET_USER=alice
if (! id -u $TARGET_USER > /dev/null 2>&1 ); then
echo "creating user $TARGET_USER"
# adduser $TARGET_USER
fi

However, it is kind of too long. In this case short-circuiting is a alternative solution.

We can write a shorter code as follow:

(! id -u $TARGET_USER > /dev/null 2>&1 ) && \
echo "creating user $TARGET_USER"

It is not enough.

The above command is equal to this script

if (! id -u $TARGET_USER > /dev/null 2>&1 ); then
echo "creating user $TARGET_USER"
else
false
fi

If our bash has a parameter -e, the above command will return a non zero code, and the whole process may terminated unexpected.

To avoid this situation, we may use a || to make sure it will always return true

(! id -u $TARGET_USER > /dev/null 2>&1 ) && \
echo "creating user $TARGET_USER" || \
true

If the result before || returns false, the whole formula will equal to

false || true

And the final result would be true.

We can also add some description.

(! id -u $TARGET_USER > /dev/null 2>&1 ) && \
echo "creating user $TARGET_USER" || \
echo "user $TARGET_USER already exists"