如何将可选参数传递给将替换脚本中现有变量的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这样的东西,但我认为这样做不行。我不是真的有兴趣重写脚本更优雅或任何东西,我大多只是对我放在主题行中的内容感到好奇。
答案 0 :(得分: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
那样优雅,但易于理解和扩展。答案 1 :(得分:0)
尝试使用getopt,从命令行中的选项中读取,然后设置变量。
答案 2 :(得分:-1)
与LtWorf建议一样,尝试使用getopt
。它从命令行中读取选项及其参数。
您可以在此处找到getopt
用法的一个很好的示例:
getopt usage example