spa*_*tn5 1 ip bash for-loop ip-address
我有以下for循环
for ip in 10.11.{32..47}.{0..255}
do
        echo "<ip>${ip}</ip>" 
done
我想10.11.{32..35}.{39..61}从上面的for循环中排除这个iprange:此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