The right side of
&& will only be evaluated if the exit status of the left side is zero (i.e. true).
|| is the opposite: it will evaluate the right side only if the left side exit status is non-zero (i.e. false).
You can consider
[ ... ] to be a program with a return value. If the test inside evaluates to true, it returns zero; it returns nonzero otherwise.
$ false && echo howdy! $ true && echo howdy! howdy! $ true || echo howdy! $ false || echo howdy! howdy!
If you do
which [, you might see that
[ actually does point to a program! It’s usually not actually the one that runs in scripts, though; run
type [ to see what actually gets run. If you wan to try using the program, just give the full path like so:
/bin/[ 1 = 1.
Here’s my cheat sheet:
- “A ; B” Run A and then B, regardless of success of A
- “A && B” Run B if A succeeded
- “A || B” Run B if A failed
- “A &” Run A in background.
to expand on @Shawn-j-Goff’s answer from above,
&& is a logical AND, and
|| is a logical OR.
See this part of the Advanced Bash Scripting Guide. Some of the contents from the link for user reference as below.
if [ $condition1 ] && [ $condition2 ] # Same as: if [ $condition1 -a $condition2 ] # Returns true if both condition1 and condition2 hold true... if [[ $condition1 && $condition2 ]] # Also works. # Note that && operator not permitted inside brackets #+ of [ ... ] construct.
if [ $condition1 ] || [ $condition2 ] # Same as: if [ $condition1 -o $condition2 ] # Returns true if either condition1 or condition2 holds true... if [[ $condition1 || $condition2 ]] # Also works. # Note that || operator not permitted inside brackets #+ of a [ ... ] construct.