Using ping to check if a host is up works, but it's slower than it needs to be, especially when the host is down. This occurs because ping assumes the network is either unreliable or slow by default. This makes sense to diagnose unreliable connections, but doesn't make sense on a reliable network.

ping on Windows only sends a few packets, then exits. ping on Linux/Mac OS sends packets forever. This also makes ping default behavior undesireable to just check if a host is up. The wait parameter is also different on Linux/Mac OS, hence the need for the wflag function.

Let's change the behavior of ping to just ping twice quickly:

wflag() {
	uname | egrep 'Linux|Darwin' >/dev/null 2>&1 && echo W || echo w
}

isUp() { 
  ping -nq -c 2 -$(wflag) 2 $1 | grep -q '0.0% packet loss'
}

isUp localhost && echo localhost is up || echo localhost is down

Using these parameters ping will only run 1 second to determine if the host is up. If the host is down, it will run for 4 seconds. This is reasonable behavior for use in a script for instance.