I'm new to bash and I'm stuck at trying to negate the following command:
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
echo "Sorry you are Offline"
exit 1
This if condition returns true if I'm connected to the internet. I want it to happen the other way around but putting !
anywhere doesn't seem to work.
if ! [[ ...
works
You can choose:
if [[ $? -ne 0 ]]; then # -ne: not equal
if ! [[ $? -eq 0 ]]; then # -eq: equal
if [[ ! $? -eq 0 ]]; then
!
inverts the return of the following expression, respectively.
Better
if ! wget -q --spider --tries=10 --timeout=20 google.com
then
echo 'Sorry you are Offline'
exit 1
fi
!
and the following command otherwise you will be doing a history expansion. unix.stackexchange.com/questions/3747/…
If you're feeling lazy, here's a terse method of handling conditions using ||
(or) and &&
(and) after the operation:
wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }
&&
after the echo command to a ;
. The reason for this is that if the output is being redirected to a file on a full disk, the echo
will return failure and the exit
will never fire. This is probably not the behaviour you want.
set -e
and failing echo
will exit the script anyway
Since you're comparing numbers, you can use an arithmetic expression, which allows for simpler handling of parameters and comparison:
wget -q --tries=10 --timeout=20 --spider http://google.com
if (( $? != 0 )); then
echo "Sorry you are Offline"
exit 1
fi
Notice how instead of -ne
, you can just use !=
. In an arithmetic context, we don't even have to prepend $
to parameters, i.e.,
var_a=1
var_b=2
(( var_a < var_b )) && echo "a is smaller"
works perfectly fine. This doesn't appply to the $?
special parameter, though.
Further, since (( ... ))
evaluates non-zero values to true, i.e., has a return status of 0 for non-zero values and a return status of 1 otherwise, we could shorten to
if (( $? )); then
but this might confuse more people than the keystrokes saved are worth.
The (( ... ))
construct is available in Bash, but not required by the POSIX shell specification (mentioned as possible extension, though).
This all being said, it's better to avoid $?
altogether in my opinion, as in Cole's answer and Steven's answer.
(( ... ))
? POSIX Programmers Reference - Compound Commands
:)
You can use unequal comparison -ne
instead of -eq
:
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
echo "Sorry you are Offline"
exit 1
fi
Success story sharing
test
command:if test $? -ne 0; then
if
expects a statement that is either 0 or 1, so you can use the command itself and invert it:if ! wget ...; then ...; fi