What does `kill -0 $pid` in a shell script do?

sending the signal 0 to a given PID just checks if any process with the given PID is running and you have the permission to send a signal to it.

For more information see the following manpages:

kill(1)
$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
kill(2)
$ man 2 kill
...
If sig is 0, then no signal is sent, but error checking is still performed; this 
can be used to check for the existence of a process ID or process group ID.
...

This is a Good Question Because...

...it can be hard to find documentation on this special signal. Despite what others have said, the only mention of this signal in man 1 kill in Debian-based systems is:

Particularly useful signals include HUP, INT, KILL, STOP, CONT, and 0.

Not especially helpful, especially if you don't already know what the signal does. It is also not listed by the output of kill -l, so you won't know about it unless you already know about it.

Where to Find It Documented

On Debian and Ubuntu systems, the output of man 2 kill says, in part:

If sig is 0, then no signal is sent, but error checking is still performed; this can be used to check for the existence of a process ID or process group ID.

What It's Good For

You can use kill -0 to check whether a process is running. Consider these examples.

# Kill the process if it exists and accepts signals from
# the current user.
sleep 60 &
pid=$!
kill -0 $pid && kill $pid

# Check if a PID exists. When missing, this should result
# in output similar to:
#    bash: kill: (6228) - No such process
#    Exit status: 1
kill -0 $pid; echo "Exit status: $?"

You can also use kill -0 to determine if the current user has permissions to signal a given process. For example:

# See if you have permission to signal the process. If not,
# this should result in output similar to:
#     bash: kill: (15764) - Operation not permitted
#     Exit status: 1
sudo sleep 60 &
kill -0 $!; echo "Exit status: $?"