Given your trying to check that a variable is not empty and not some other value as in the following code:
if [ ! -z "$foo" ] && [[ ${foo} != "bar" ]]; then
what is the best practice for accomplishing this. I've seen bash conditionals written several ways including the following...
if [[ ! -z "$foo" && ${foo} != "bar" ]]; then
I understand there is a difference when using the single brackets and the double, I'm more concerned with when to put the && or || inside the brackets or out.
Put &&/|| inside brackets for [[ ]]. Outside is also accepted.
Put &&/|| outside brackets for [ ]. Inside is NOT allowed.
This is due to the fact that && binds normal commands together based on return value, e.g.
wget file && echo "Success"
[, despite its funny name, is a regular command and obeys the same rules as e.g. wget or echo.
[ foo || bar ] is two commands, [ foo and bar ], neither of which are valid.
[[ .. ]] on the other hand is not a normal command but special shell syntax. [[ foo || bar ]] is a single command, and interpretted accordingly.
To complete the previous answers :
if [[ ! -z $foo && $foo != "bar" ]]; then ...
# [[ will execute the two conditions with "and" operator in a single instruction
Is equivalent of :
if [[ ! -z $foo -a $foo != "bar" ]]; then ...
# [[ will execute the two conditions with "and" operator in a single instruction
But not equivalent of :
if [[ ! -z $foo ]] && [[ $foo != "bar" ]]; then ...
# second [[ will be executed if the first success ($? = 0)
-a (and) and -o (or) will work with test and [.
See man test to get more details ;)
Otherwise, no need to protect your variables by doubles quotes with [[ and no need to use delimiters (${}) in this case.
Here is a reminder about the necessity (or not) to protect your variables with double quotes..
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With