当我使用ping foo.com
时,我得到回复或ping: unknown host foo.com
我正在使用此脚本显示自定义响应
status=$(ping -c 1 foo.com 2> /dev/null)
if [[ status -ne '200' ]]; then
echo "site found"
else
echo "site not found"
fi
上述问题是,如果找到网站,我会收到site found
响应,但如果没有,则会收到错误消息,我会收到默认ping: unknown host foo.com
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
答案 0 :(得分:3)
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
会抑制所有输出和测试
ping命令的返回状态为0(成功)或其他(失败)。
[[ status -ne '200' ]]
接受字符串status
和字符串200
,将每个字符串转换为整数并测试两个整数的不等式,这听起来是无意义的。
shell命令的返回状态保存在$?
变量中,它与HTTP返回码无关。 HTTP运行在TCP之上,而ping甚至不使用TCP。
如果目标站点已启动并且说HTTP,您可以在stdout上获取http状态:
httpStatus(){ curl -s -w %{http_code} "$@" -o /dev/null; }
如,
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