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

时间:2013-09-24 07:22:13

标签: bash for-loop arguments

我正在尝试编写一个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}

有谁知道是否可以使这项工作成功? 或者我是否需要重新考虑我的appraoch?

提前致谢。

3 个答案:

答案 0 :(得分:6)

您可以使用seq替换

for ip in {$2..$3}

说:

for ip in $(seq $2 $3)

答案 1 :(得分:3)

Brace扩展不适用于变量,因为它是在变量扩展之前执行的。您可以使用c风格的循环代替:

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

答案 2 :(得分:3)

您可以使用seq命令(coreutils的一部分)生成列表;像这样

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