2

我正在编写 Linux Bash 中的脚本,可以使用不同类型的选项。基本上,该程序将 ping 到给定的 IP 地址。

现在,我想让用户在终端中写入一系列 ip 地址,然后程序将 ping。

Fe:bash pingscript 25 - 125

然后该脚本将 ping 192.168.1.25 和 192.168.1.125 之间的所有地址。

这并不难,我只需要写一个小案例

[0-9]-[0-9] ) ping (rest of code)

现在的问题是:这段代码只能让我ping fe 的号码。0 - 9 而不是 10 - 25

为此,我需要写: [0-9][0-9]-[0-9][0-9] (fe: ping 25 - 50)

但是有可能一侧有 1 个数字,另一侧有 2 个数字:[0-9]-[0-9][0-9] (fe: ping 1 - 25)

或者:[0-9]-[0-9][0-9][0-9] (fe: ping 1 - 125)

等等......这意味着有很多可能性。可能还有另一种写法,但是怎么写呢?

我不希望任何字母出现在参数中,但我不能从那个开始(循环系统)。

4

2 回答 2

3

那个怎么样:

for i in 192.168.1.{25..125}; do ping -qnc1 $i; done

或者在以变量为参数的脚本中:

for i in $(seq -f "192.168.1.%g" $1 $2); do ping -qnc1 -W1 $i; done

其中第一个参数是开始的数字,第二个参数是结束的数字。像这样调用脚本:

./script 25 125

ping选项:

  • -q: ping 不打印摘要
  • -n: 没有 dns 查询
  • -c1: 只寄1个包裹
  • -W1:超时到 1 秒(当然可以增加)
于 2015-05-26T12:27:32.440 回答
2

您可以通过启用extglobshell 选项在脚本中使用扩展模式匹配:

shopt -s extglob

因此,您可以使用带有+量词的大括号,如下所示:

#!/bin/bash

shopt -s extglob

case $1 in
+([0-9])-+([0-9]) )
    # do stuff
    ;;
esac
于 2015-05-26T12:38:09.310 回答