在bash脚本中替换变量的可选参数

时间:2013-03-13 09:39:40

标签: linux bash variables host

如何将可选参数传递给将替换脚本中现有变量的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这样的东西,但我认为这样做不行。我不是真的有兴趣重写脚本更优雅或任何东西,我大多只是对我放在主题行中的内容感到好奇。

3 个答案:

答案 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