【问题标题】:Bash Script: options - case: range of multiple numbersBash 脚本:选项 - 案例:多个数字的范围
【发布时间】:2015-08-08 02:35:40
【问题描述】:

我正在编写 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)

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

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

【问题讨论】:

    标签: linux bash case command-line-arguments optional-arguments


    【解决方案1】:

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

    shopt -s extglob
    

    因此,您可以像这样使用带有+ 量词的大括号:

    #!/bin/bash
    
    shopt -s extglob
    
    case $1 in
    +([0-9])-+([0-9]) )
        # do stuff
        ;;
    esac
    

    【讨论】:

    • 这个也可以在bash中使用吗?我看到你使用#!/bin/sh ?
    • @Kryptonous 是的,它可以在 bash 中使用,这是文档 gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html 我已经更正了我的答案。
    • 我在 bash 中尝试过,它确实有效。感谢您的链接!这真的很有帮助。好消息是我可以实现这两种解决方案来实现所需的输出。
    【解决方案2】:

    怎么样:

    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 秒(当然可以增加)

    【讨论】:

    • 您介意解释一下您的第二段代码中使用的选项/功能吗?我真的不明白 -qnc1 -W1 $i$(seq -f (...).%g
    • 谢谢,$(seq -f 是什么意思?或者你有链接到它的解释?非常感谢,已经!
    • @Kryptonous seq 25 125 例如仅打印从 25 到 125 的所有数字。-f 是此输出应具有的格式。在你的情况下:192.168.1.25 到 192.168.1.125 如果 $1 是 25 而 $2 是 125。
    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2017-09-06
    • 2015-04-22
    相关资源
    最近更新 更多