Я пытаюсь выполнить код в зависимости от того, получает ли traceroute ответ с определенного IP-адреса. Так:
if traceroute 123.456.78.9
then
option 1
else
option 2
Моя проблема в том, что независимо от того, получаю я ответ с IP-адреса или нет, всегда выполняется вариант 1.
Я пробовал использовать ping вместо traceroute, и он работает, но у меня нет возможности использовать ping в окончательном коде.
Подробнее:
Результат успеха:
traceroute to 123.456.78.9 (123.456.78.9), 1 hops max, 40 byte packets
1 123.456.78.9 (123.456.78.9) 0.000 ms 1.000 ms 0.000 ms
Вывод отказа:
traceroute to 123.456.78.90 (123.456.78.90), 1 hops max, 40 byte packets
1 *
Если traceroute всегда сообщает об успешном завершении работы, даже если он не может связаться с удаленной системой, сообщите об этом поставщику операционной системы - это они предоставили вам traceroute; это не часть bash. OTOH, если вы хотите прочитать стандартный вывод traceroute и оттуда определить успех или неудачу, мы можем это сделать, но вам нужно будет предоставить много дополнительную информацию в вашем вопросе (в частности, образец вывода как в случае успеха, так и в случае неудачи, а также подробности о что вы ожидаете считать неудачей). Без этих подробностей ответы будут работать только в ОС, запущенной отвечающим.
Спасибо за ваш ответ. Я добавил больше деталей на основе вашего комментария. Кроме того, я не совсем уверен, как проверить статус выхода с помощью echo $, как вы упомянули выше.
echo $?. ? является его частью. Сравните true; echo $? с false; echo $?. Вы увидите, что первое значение равно 0 (статус выхода, который if и другие условные выражения будут рассматривать как успех), а второе - 1 (которое, как и любое другое ненулевое значение, рассматривается как сбой).





Проблема в том, что traceroute всегда отображает вывод, даже если нет действительного хоста, поэтому вам нужно сначала проверить действительные ответы.
Вы должны проверить, получен ли действительный ответ или нет
Попробуйте использовать
n=`traceroute 123.456.78.9|grep ms|wc|sed 's/ //g' |cut -d ' ' -f 1`
if [ $n -eq 0 ]
then
echo 'failed'
else
echo 'success'
fi
Если ms вообще обнаруживается только в случае успеха, не может ли это быть просто if traceroute 123.456.78.9 | grep -q ' ms'; then echo success; else echo failed; fi? Трубопровод кажется излишним.
(Кроме того, как заметил бы shellcheck.net, лучше цитировать расширения, как в [ "$n" -eq 0 ]; таким образом, если вы каким-то образом закончили с пустым значением для n, вы получите более полезное сообщение об ошибке от test).
Спасибо за это уточнение
Запустите
traceroute 123.456.78.9, а затемecho $?, чтобы проверить статус выхода. Если это0, это считается успехом. Если это1, это считается отказом.