在Bash循环中生成IP地址列表

13

我需要一个从130.15.0.0到130.15.255.255的IP地址列表。我尝试过这个方法,但我意识到这将创建255个列表。请问有人能帮我想出解决办法吗?

for (( i = 0; i <= 255; i++)) ; do
for (( j = 0; j <= 255; j++)) ; do
LIST="$LIST 130.15.$i.$j"
done
done

3
你能否添加你得到的输出并解释为什么它不是你期望的输出? - that other guy
2
看起来它创建了256 * 256 = 65536个IP地址。那么,出了什么问题? - ROMANIA_engineer
@Benjamin W. 以优雅的方式回答了 K.U 的问题,但是关于 K.U 的问题的答案可以在这里找到(剧透:在循环之前使用 declare -a LIST=()LIST+=("130.15.$i.$j"))http://unix.stackexchange.com/questions/211395/in-a-loop-over-an-array-add-an-element-to-the-array - duanev
1个回答

32

我认为你的方法是可行的,但速度非常慢1。你可以使用花括号扩展代替:

echo 135.15.{0..255}.{0..255}

或者,如果你想将结果存在一个变量中,只需赋值:

list=$(echo 135.15.{0..255}.{0..255})

如果你想要将地址存储在一个数组中,可以省略 echo 和命令替换:

list=(135.15.{0..255}.{0..255})

现在,list 是一个合适的数组:

$ echo "${list[0]}"                    # First element
135.15.0.0
$ echo "${list[@]:1000:3}"             # Three elements in the middle
135.15.3.232 135.15.3.233 135.15.3.234

你的代码评论:

  • 可以考虑用

    list="$list new_element"
    

    使用字符串连接符追加字符串更容易

    list+=" new_element"
    
  • 如果您想要在循环中追加到数组中,您可以使用

  • list+=("new_element")
    
  • 不建议使用大写变量名,因为它们更容易与环境变量冲突(参见POSIX规范,第四段)

1 实际上,在我的计算机上,这需要近六分钟时间 – 大括号扩展只需要不到0.1秒钟!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接