在bash中使用命令行参数进行for循环

3
我正在尝试编写一个Bash脚本,用于对一系列IP地址执行反向DNS查找。想法是将网络(前3个八位字节)作为$1提供,将要检查的范围起始位置作为$2,将该范围的结束位置作为$3。
所以我最终得到了以下内容:
#!/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}

有人知道是否可以使其工作吗? 还是我需要重新考虑我的方法?

提前感谢。


请查看花括号扩展的描述,了解为什么您输入的内容无法正常工作。 - Jonathan Leffler
3个回答

6
你可以使用seq替换。
for ip in {$2..$3}

说:

for ip in $(seq $2 $3)

1
seq 命令可能比 c 风格的循环更具可移植性。缺点是它会创建一个额外的进程,并且迭代次数受命令缓冲区大小的限制。 - user000001
感谢您提供的信息和方法,但由于此处使用情况最多只有255次迭代,所以这不应该是一个问题。如果我理解有误,请指正。 - fragman

4

花括号扩展不适用于变量,因为它在变量扩展之前执行。您可以使用C语言风格的for循环代替:

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

3
您可以使用seq命令(核心工具的一部分)生成列表,就像这样:
for ip in $(seq $2 $3)
do
    host $1.$ip | grep pointer
done

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