Bash-用于循环的变量范围

时间:2019-02-22 19:59:53

标签: bash

尝试将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

2 个答案:

答案 0 :(得分:1)

这种seqxargs的用法看起来很有趣:

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,但是那样不那么酷。

有什么好处,很容易使其成为函数。

答案 1 :(得分:0)

这有效...它使用eval而不是循环将所有ip地址写入文件,然后按空格将其拆分,并用换行符将该空格替换为另一个文件。

cidr=$1

# 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

eval "echo {$a..$e}.{$b..$f}.{$c..$g}.{$d..$h}" > ip_range.txt

tr ' ' '\n' < ip_range.txt > results.txt

您也可以改为执行此操作,并一次性编辑间距...

cidr=$1

# 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

eval "printf '%s\n' {$a..$e}.{$b..$f}.{$c..$g}.{$d..$h}" > ip_range.txt