1

如何将可选参数传递给将替换脚本中现有变量的 bash 脚本?例如:

#!/bin/bash
#hostfinder.sh
#Find hosts in current /24 network

subnet=$(hostname -i | cut -d. -f1,2,3)

for j in \
    $(for i in $subnet.{1..255}; do host $i; done | grep -v not | cut -d" " -f5)
do ping -c1 -w 1 $j; done | grep -i from | cut -d" " -f3,4,5 | tr ':' ' ' | \
sed -e 's/from/Alive:/'

这将获取当前主机的 IP,对可能的邻居运行反向查找,ping 测试它找到的任何主机名,并显示类似于以下的输出:

Alive: host1.domain (10.64.17.23)
Alive: host2.domain (10.64.17.24)
...

说我疯了,但它比 nmap 快得多,而且会吐出一个不错的列表。

无论如何,我想在执行脚本时选择将任何 C 类网络地址的前三个八位字节作为 $1 参数传递给 $subnet 变量。例如:

./hostfinder.sh 10.20.0

我的第一个想法是尝试 $subnet=$1 之类的方法,但我认为这行不通。我对重写脚本以使其更优雅或其他任何东西都不是很感兴趣,我主要只是对我在主题行中输入的内容感到好奇。

4

3 回答 3

2

怎么换:

subnet=$(hostname -i | cut -d. -f1,2,3)

和:

case $# in  
  0) subnet=$(hostname -i | cut -d. -f1,2,3);;
  1) subnet="${1}";;
  *) echo "To many arguments" >&2; exit 1;;
esac
  • $#是命令行参数的数量
  • 这不太优雅,getopt但易于理解和扩展。
于 2013-03-13T10:35:11.027 回答
0

尝试使用 getopt 从命令行中读取选项,然后设置变量。

于 2013-03-13T09:42:18.307 回答
-1

像 LtWorf 建议的那样,尝试使用getopt. 它从命令行读取选项及其参数。

您可以在getopt这里找到一个很好的用法示例: getopt 用法示例

于 2015-04-16T08:19:49.637 回答