Сравните трассировочный IP со значениями массива - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь сравнить, если трассировка удалась или нет в bash. Это то, что я исполняю.

traceroute -m 30 -n 8.8.8.8 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'

Вывод получаю:

8.8.8.8

8.8.8.8

192.192.192.21

192.191.191.32

192.18.128.48

8.8.8.8

192.168.168.168

Я хочу сравнить 8.8.8.8 (первое значение массива) с последними 3 значениями массива, но при попытке получить ошибку для сравнения с плавающей запятой.

Edit:

Я попробовал этот код, но он выдает ошибку для сравнения с плавающей точкой.

for i in ${my_array[@]};
do
        if [ "${my_array[0]}" == "${my_array[i+1]}" ]; then
                echo "values are same";
        else
                echo "values are not same";
        fi
        echo $i;    
done

Я знаю, что можно использовать "bc" для решения задачи сравнения с плавающей запятой, но есть ли другой способ решить эту строку, а не хранить ее в массиве?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы можете использовать это awk для вашего требования:

traceroute -m 30 -n 8.8.8.8 |&
awk '$1=="traceroute"{ip=$3} /ms$/{a[++n] = ($1+0 == $1 ? $2 : $1)}
     END{for (i=n-2; i<=n; i++) if (ip == a[i]) exit 1}'

Он выйдет со статусом 1, когда любой IP-адрес в последних 3 строках совпадет с IP-адресом в первой строке, которая начинается с traceroute. Если совпадений нет, статус выхода будет 0.

0 голосов
/ 28 июня 2018

Я хочу сравнить 8.8.8.8 (первое значение массива) с последними 3 значениями массива

Просто получите первое значение в выводе и добавьте в него последние 3 строки:

output="8.8.8.8

8.8.8.8

192.192.192.21

192.191.191.32

192.18.128.48

8.8.8.8

192.168.168.168"

output=$(sed '/^$/d' <<<"$output") # remove empty lines

if grep -q "$(head -n1 <<<"$output")" <(tail -n3 <<<"$output"); then
        echo "Last three lines of output contain first line of the output"
else
        echo "fus ro dah"
fi

Теперь к вашему коду:

for i in ${my_array[@]};

Итерация по значениям в my_array. Если вы хотите индексы массива, вам нужно перебрать их с for ((i = 0; i < ${#my_array[@]}; ++i)). Теперь я думаю это:

for ((i = ${#my_array[@]} - 3; i < ${#my_array[@]}; ++i)); do
        if [ "${my_array[0]}" = "${my_array[i]}" ]; then
                echo "values are same";
        else
                echo "values are not same";
        fi
        echo $i;    
done

, вероятно, будет делать то, что вы хотите, но с использованием grep:

if grep -q "${my_array[0]}" <(printf "%s\n" "${my_array[@]: -3}"); then
    echo "values are same"
else
    echo "values are not same"
fi

еще проще (для меня).
Также обратите внимание, что «оператор» сравнения строк (не знаю, как это называется) в test равен =, а не ==.

...