如何将一个可选的参数传递给一个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这样的方法,但我认为这样做行不通。我不是真的有兴趣重新写剧本更优雅或什么,我大多只是好奇我把什么放在主题行。

最佳答案

换一个怎么样:

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那样优雅,但易于理解和扩展。

10-07 16:43