我正在尝试比较traceroute是否成功。这就是我执行的。
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(数组的第一个值)与数组的后三个值进行比较,但是当我尝试它时,出现浮点比较的错误。
编辑:
我尝试了这段代码,但是它给我浮点数比较带来了错误。
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”解决浮点比较问题,但是还有其他方法可以解决此内联而不是将其存储在数组中吗?
答案 0 :(得分:2)
我想将8.8.8.8(数组的第一个值)与数组的后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
中的值。如果要索引为数组,则需要使用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”(不叫它)是=
而不是==
。
答案 1 :(得分:2)
您可以根据需要使用此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}'
当最后3行中的任何IP地址与以1
开头的第一行IP匹配时,它将以状态traceroute
退出。如果没有匹配项,则退出状态将为0
。