bash - 用于IP范围的循环,不包括某些IP

时间:2015-06-12 21:09:00

标签: bash for-loop ip ip-address

我有以下for循环

for ip in 10.11.{32..47}.{0..255}
do
        echo "<ip>${ip}</ip>" 
done

我想从上面的for循环中排除这个iprange:10.11.{32..35}.{39..61}。此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

2 个答案:

答案 0 :(得分:7)

试试这个:

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

答案 1 :(得分:2)

试试这个:

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