【问题标题】:How to simplify an if-else statement matching IP address如何简化匹配 IP 地址的 if-else 语句
【发布时间】:2019-04-18 16:29:45
【问题描述】:

我想简化以下 If-Else 语句。

if [[ "$IP" == 192.* ]] || [[ "$IPAddr" == 193.* ]]
then
    data="correct data set"
fi 

我需要包含更多 [[ "$IP" == 192.* ]] 并想看看是否有更好的方法来做同样的事情,而不是使用太多 || 语句

【问题讨论】:

  • 小心...192.* 匹配 192.168.*.*,这是一个私有 IP 地址。 192.200.*.*193.*194.*不是私有 IP 地址。

标签: linux bash shell sh rhel


【解决方案1】:

您可以使用case 更轻松地做到这一点。

case "$IP" in 
    192.* | 193.*) data="correct data set";;
esac

您可以添加更多以|分隔的模式。

此外,您可以使用19[23].* 之类的模式来匹配两个字符串。

【讨论】:

    【解决方案2】:

    由于这是全局匹配,您可以使用字符范围:

    # 192.0.0.0 or 193.0.0.0
    if [[  "$IP" == 19[23].* ]]
    then echo "match"; fi
    

    或 extglob 交替:

    # 192.0.0.0 or 10.0.0.0
    if [[  "$IP" == @(192|10).* ]]
    then echo "match"; fi
    

    【讨论】:

      【解决方案3】:

      您似乎专门尝试匹配多个变量($IP$IPAddr)。

      如果你在这两种情况下都是指$IP,那么给出的解决方案是好的。

      否则,每个测试都是一组不同的 A 和 B 比较,因此|| 的列表可能仍然是您的最佳选择。您可以跨行格式化它们以提高可维护性和可读性,不过...

      if [[ "$IP"     == 192.* ]] || 
         [[ "$IPAddr" == 193.* ]]
      then data="correct data set"
      fi 
      

      &&|| 设置跨行上下文。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 2022-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多