4

Я пишу bash-скрипт для проверки связи с заданным именем хоста и отображения активности хоста (отображать простое сообщение). Должно быть легко, но вместо этого болит голова. Вот что у меня так далеко:

    echo & echo "DOI (Domain):" &&read input 
    ip=$(ping -c 1 $input | gawk -F'[()]' '/PING/{print $2}') 
    if [ $? -eq 0 ]; then  
        echo "$ip is up";  
    else   
        echo "host is down";  
    fi  
    sleep 60  

Вот вывод:
Успешный пинг (и ответ), он отвечает:

    74.125.226.119 is up

Тем не менее, в случае невозможности получить ответ, он по-прежнему отвечает:

    ping: unknown host google.ccccaa 
    is up

а не эхо "хозяин не работает"

Очевидно, я что-то упустил. Я ненавижу задавать подобные вопросы, и я уверен, что ответ уже где-то здесь скрывается, но опять же я зашел в тупик и не могу найти то, что ищу. Я даже не совсем уверен, что я ищу.

РЕДАКТИРОВАТЬ: Решено! Спасибо за полезные советы!

Вот финал:

    echo & echo "DOI (Domain):" &&read input    
    output=$(ping -c 1 "$input" 2>/dev/null)  
    if [ $? -eq 0 ]; then  
       ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}'  2>/dev/null )  
       echo "$input ($ip) is up";  
    else  
       echo "Host not found";  
    fi  
    sleep 60  

2 ответа2

5

Во-первых, вы должны добавить 2>/dev/null к вызову ping , чтобы сообщения об ошибках от ping не выводились со стандартной ошибкой.

Во-вторых, $? в вашем коде не будет содержаться ожидаемый вами результат, потому что состояние возврата конвейера является состоянием выхода последней команды, которая в вашем случае является gawk , а состояние выхода ping просто игнорируется. Вы можете переписать код, например, так:

output=$(ping -c 1 "$input" 2>/dev/null)
if [ $? -eq 0 ]; then
    ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}')  
    echo "$ip is up";
else
    echo "host is down";
fi
4

Я думаю, что awk не является необходимым. Если я не пропустил что-то, что код должен сделать свое дело:

#!/bin/bash

host=$1
ping -c1 $host > /dev/null 2> /dev/null
[[ $? == 0 ]] && echo "$host is up" || echo "$host is down/not reachable"

Вот пример:

$ ./checkping www.google.com
www.google.com is up
$ ./checkping www.google.utld
www.google.utld is down/not reachable

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .