首页 > 解决方案 > Bash - 具有变量范围的 for 循环

问题描述

尝试将 IP 地址范围打印到文件中。它不是循环遍历范围,而是打印包含变量值的一行。

http://tpcg.io/0lCSJr

cidr="192.168.0.1/24"

# range is bounded by network (-n) & broadcast (-b) addresses.
lo=$(ipcalc -n $cidr |cut -f2 -d=)
hi=$(ipcalc -b $cidr |cut -f2 -d=)

read a b c d <<< $(echo $lo |tr . ' ')
# echo $a.$b.$c.$d
read e f g h <<< $(echo $hi |tr . ' ')
# echo $e.$f.$g.$h


for ip in {$a..$e}.{$b..$f}.{$c..$g}.{$d..$h};
do
    echo $ip > results.txt
done;

电流输出...

{192..192}.{168..168}.{0..0}.{0..255}

如果给出192.168.0.1/24寻找如何获取输出以在文件的每一行上打印该网络中的每个主机...

192.168.0.0
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
...
192.168.0.255

标签: bash

解决方案


seq和的这种用法xargs看起来很酷很有趣:

seq 192 192 |
xargs -i seq -f "{}.%.0f" 168 168 |
xargs -i seq -f "{}.%.0f" 0 0 |
xargs -i seq -f "{}.%.0f" 0 255

所以在你的脚本中是:

seq $a $e |
xargs -i seq -f "{}.%.0f" $b $f |
xargs -i seq -f "{}.%.0f" $c $g |
xargs -i seq -f "{}.%.0f" $d $h |
while read ip; do
   ...
done

或者你可以for ip in $(seq $a $e | .... ); do,但这会不那么酷。

有什么好,很容易使它成为一个功能。


推荐阅读