我有下面的for循环
for ip in 10.11.{32..47}.{0..255}
do
echo "<ip>${ip}</ip>"
done
我要排除这种iprange: 10.11.{32..35}.{39..61}
从上面的for循环。 这个IP范围是上述之一的子集。 有没有办法做到这一点?
我想这一点,这并不工作:
abc=10.11.{34..37}.{39..61}
for ip in 10.11.{32..47}.{0..255}
do
if [[ $ip == $abc ]]
then
echo "not_defined"
else
echo "<ip>${ip}</ip>"
fi
done
尝试这个:
for ip in 10.11.{32..47}.{0..255}
do
echo 10.11.{32..35}.{39..61} | grep -q "\<$ip\>" && continue
echo "<ip>${ip}</ip>"
done
这当然是一个简单的解决方案,它仍然可以通过一套完整的循环,并扔掉了一些不需要的元素。 由于您的评论暗示,这可能会产生被忽略的部件过程中出现不必要的延误。 为了避免这些,可以产生在平行于像这样处理的值:
for ip in 10.11.{32..47}.{0..255}
do
echo 10.11.{32..35}.{39..61} | grep -q "\<$ip\>" && continue
echo "${ip}"
done | while read ip
do
process "$ip"
done
如果process "$ip"
是至少服用少量的时间,那么时间值的产生很可能不会陷入帐户了。
如果你想完全跳过值,还可以使用更复杂的术语,你的IP地址(但那么它不会清楚这个代码,你在你的问题给出了规范了如何得出的,所以我更彻底的评论吧):
# ranges below result in
# 10.11.{32..47}.{0..255} without 10.11.{32..35}.{39..61}:
for ip in 10.11.{32..35}.{{0..38},{62..255}} 10.11.{36..47}.{0..255}
do
echo "${ip}"
done
尝试这个:
printf "%s\n" 10.11.{32..47}.{0..255} 10.11.{32..35}.{39..61} | sort | uniq -u | while read ip; do echo $ip; done