将 traceroute IP 与数组值进行比较

Compare traceroute IP with array values

我正在尝试比较 traceroute 在 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 个值进行比较,但是当我尝试比较时,出现浮点数比较错误。

编辑:

我试过这段代码,但它给我错误的浮点数比较。

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" 来解决浮动比较问题,但是除了将其存储在数组中之外,还有其他方法可以解决这个内联问题吗?

I want to compare 8.8.8.8 (first value of the array) with last 3 values of the array

只需获取输出中的第一个值,然后用最后 3 行对其进行 grep:

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 中的 。如果你想要数组的 indexes,你需要用 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 中的字符串比较 "operator"(不知道它是如何调用的)是 = 而不是 ==.

您可以使用此 awk 满足您的要求:

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

当最后 3 行中的任何 IP 地址与以 traceroute 开头的第一行中的 IP 地址匹配时,它将以状态 1 退出。如果没有匹配项,则退出状态将为 0.