2013-09-24 65 views
2

我试图编写一个应该对IP地址范围执行反向DNS查找的bash脚本。这个想法是提供网络(前3个八位字节)为1美元,范围的开始将被检查为2美元,并且所述范围的结束为3美元。在for循环中使用命令行参数(bash)

所以我结束了:

#!/bin/bash 
if [ $# -ne 3 ] 
then 
    echo "[*] Usage: reverselookup.sh [Network (x.x.x)] [start of range (y)] [end of range (z)]" 
    exit 1 
fi 

for ip in {$2..$3} 
do 
    host $1.$ip | grep pointer 
done 

现在,我认为这将使用正常序列操作在bash for循环,就像

for i in {2..5} 

为您提供了2,3环,4和5.但它不起作用。

如果我在回路中回显$ ip并将其作为例如

reverselookup.sh 192.168.10 21 50 

它送给我

{21..50}

有谁知道是否有可能使这项工作? 还是我不得不重新考虑我的方法?

在此先感谢。

+0

参见[括号展开]的说明(http://www.gnu.org/software/bash/manual/bash.html#Brace-Expansion)明白为什么你输入什么也不会工作。 –

回答

6

您可以使用seq更换

for ip in {$2..$3} 

说:

for ip in $(seq $2 $3) 
+1

seq命令可能更适合c风格的循环。缺点是它会创建一个额外的进程,并且迭代次数受命令缓冲区大小的限制。 – user000001

+0

感谢您的信息以及您的方法,但由于这里的用例最多有255次迭代,所以这不应该成为问题。如果那是错误的,请纠正我。 – fragman

+1

@fragman这不会是一个问题。 – devnull

3

Brace扩展不会与变量一起使用,因为它在变量扩展之前执行。您可以使用C风格的for循环,而不是:

for ((ip=$2; ip<=$3; ip++)) 
do 
    .... 
done 
3

可以使用的coreutils的序列指令(部分)来生成列表;像这样

for ip in $(seq $2 $3) 
do 
    host $1.$ip | grep pointer 
done