我有下面的for循环
for ip in 10.11.{32..47}.{0..255}
do
echo "<ip>${ip}</ip>"
done我想从上面的for循环中排除这个iprange:10.11.{32..35}.{39..61}。此网段是上述网段的子集。有没有办法做到这一点?
我试过了,这不管用:
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发布于 2015-06-13 05:23:20
试试这个:
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"至少占用了最少的时间,那么很可能不会再考虑生成值的时间。
如果你想完全跳过这些值,你也可以用一个更复杂的术语来表示你的I(但这样就不清楚这段代码是如何从你的问题中给出的规范中派生出来的,所以我最好对它进行彻底的注释):
# 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发布于 2015-06-13 05:15:51
试试这个:
printf "%s\n" 10.11.{32..47}.{0..255} 10.11.{32..35}.{39..61} | sort | uniq -u | while read ip; do echo $ip; donehttps://stackoverflow.com/questions/30812197
复制相似问题