When I use ping foo.com
I either get a response or ping: unknown host foo.com
I am using this script to show custom responses
status=$(ping -c 1 foo.com 2> /dev/null) if [[ status -ne '200' ]]; then echo "site found" else echo "site not found" fi
the problem with the above is that, if site is found I get site found
response, but if not instead of the error message, I get the default ping: unknown host foo.com
UPDATED.
declare -A websites websites=("" "") function ping_sites(){ if [[ $1 != 'all' ]]; then status=$(curl -I --stderr /dev/null $1 | head -1 | cut -d' ' -f2) result=$(ping -c 1 $1 | grep 'bytes from' | cut -d = -f 4 | awk {'print $1'} 2> /dev/null) if [[ status -ne '200' ]]; then echo -e "$1 $c_red t $status FAIL $c_none" else echo -e "$1 $c_green t $status OK $c_none" fi else ...
.
ping all ping foo.com
Advertisement
Answer
pingWrap(){ if ping -c 1 "$1" >/dev/null 2>&1; then echo "site found" else echo "site not found" fi } pingWrap foo.com pingWrap localhost
if ping -c 1 "$1" >/dev/null 2>&1; then
suppresses all output and tests
the return status of the ping command which is either 0 (success) or something else (failure).
[[ status -ne '200' ]]
takes the string status
and the string 200
, converts each to an integer and tests the two integers for inequality, which is as nonsensical as it sounds.
The return status of a shell command is held in the $?
variable and it has nothing to do with HTTP return codes. HTTP runs on top of TCP, and ping doesn’t even use TCP.
HTTP Statuses
If the target site is up and speaks HTTP, you can get the http status on stdout with:
httpStatus(){ curl -s -w %{http_code} "$@" -o /dev/null; }
E.g.,
httpStatus google.com #200 httpStatus google.com/secret #301 st="`httpStatus "$1"`" && case "$st" in 301) echo Moved permanently;; 200) echo Success;; *) echo Unknown;; esac