How to Evaluate Grep Result in Bash?

How to Evaluate Grep Result in Bash?

I want to grep a specific status of a service (tomcat8.service).

Only if the string was found, I want to execute some logic.

Problem: even if I execute the script on service name that does not exist ("asd" in this example), the if $status still matches and prints out. But why?

status = $(systemctl status asd.service | grep 'active')
echo $status

if $status
then 
    echo "$SERVICE was active"
    exit 0
fi 
exit 0

Result output is: asd.service was active, which is certainly not true.

The echo $status prints: status: Unknown job: =

1

2 Answers

You can make use of grep's return status.

systemctl status asd.service | grep 'active' \
    && status=active \
    || status=not_active

if [ "$status" == "active" ]; then
    [...]
fi

or even easier:

test $(systemctl status asd.service | grep 'active') \
    && echo "$SERVICE was active"

or if you prefer if:

if $(systemctl status asd.service | grep 'active'); then
    echo "$SERVICE was active"
fi

Anyways, take care about the keywords inactive, not active, active (exited) or alike. This will also match your grep statement. See the comments. Thanks @ Terrance for the hint.


Update:

No need for grep. systemctl has the command is-active included.

systemctl -q is-active asd.service \
    && echo "$SERVICE was active"

or:

if systemctl -q is-active asd.service; then
    echo "is active";
fi
8

Some code review comments:

  • sh/bash/ksh/zsh variable assignments look like var=value -- no spaces around the = are allowed. (documentation)
  • status=$(some command) -- the status variable hold the output of the command, not the exit status. The exit status is in the $? variable
  • the if statement acts on the exit status of the subsequent command (documentation)

    if some_comment; then action1; else action2; fi
    

    Most often, the command is [ or [[ to test some condition.

    However, grep has a clear exit status: 0 if the pattern was found, 1 otherwise. So you want this:

    if systemctl status asd.service | grep -q 'active'; then
        echo "$SERVICE was active"
    fi
    
James H. Sterling
Author

James H. Sterling

James Sterling reports on renewable energy developments, climate policy, ecological conservation, and green tech innovations around the globe.