【问题标题】:Bash regular expression if statementBash 正则表达式 if 语句
【发布时间】:2016-02-02 06:21:31
【问题描述】:

我不确定我做错了什么,它不起作用的原因是没有意义的:

这个我确实得到了预期的SSH结果

if [ "Hennopsview" != "2 - LAN" ] && [ "Hennopsview" != "1 - WAN" ] \
           && [ "Hennopsview" != "Cross Connect" ]; then
    if [[ "Hennopsview" =~ /pptp/g ]]; then
        echo "No Match 2"
    else
        ssh admin@192.168.0.1 ':put [/interface eoip get [/interface eoip find name="Hennopsview"] remote-address]'
    fi
else
    echo "No Match"
fi

但是下面的没有给我匹配 2 的回声

if [ "<pptp-hennopsview>" != "2 - LAN" ] && [ "<pptp-hennopsview>" != "1 - WAN" ] \
            && [ "<pptp-hennopsview>" != "Cross Connect" ]; then
    if [[ "<pptp-hennopsview>" =~ /pptp/g ]]; then
        echo "No Match 2"
    else
        ssh admin@192.168.0.1 ':put [/interface eoip get [/interface eoip find name="<pptp-hennopsview>"] remote-address]'
    fi
else
    echo "No Match"
fi

这个正则表达式有什么问题?

以下解决了第二个请求

if [ "<pptp-hennopsview>" != "2 - LAN" ] && [ "<pptp-hennopsview>" != "1 - WAN" ] \
            && [ "<pptp-hennopsview>" != "Cross Connect" ]; then
    if [[ "<pptp-hennopsview>" =~ [pptp] ]]; then
        echo "No Match 2"
    else
        ssh admin@154.127.117.218 ':put [/interface eoip get [/interface eoip find name="<pptp-hennopsview>"] remote-address]'
    fi
else
    echo "No Match"
fi

但随后破坏了原来的

if [ "Hennopsview" != "2 - LAN" ] && [ "Hennopsview" != "1 - WAN" ] \
            && [ "Hennopsview" != "SDA - Cross Connect" ]; then
    if [[ "Hennopsview" =~ [pptp] ]]; then
        echo "No Match 2"
    else
        ssh admin@154.127.117.218 ':put [/interface eoip get [/interface eoip find name="Hennopsview"] remote-address]'
    fi
else
    echo "No Match"
fi

我明白使用“[pptp]”是字符匹配而不是单词。为什么用“/”替换“[”不能解决问题?

【问题讨论】:

  • bash tag wiki 提供了一些技巧,可以让您的问题最小化且易于回答。也许下次再回顾一下!

标签: regex bash if-statement mikrotik


【解决方案1】:

/pptp/g 将匹配字符串".../pptp/g..."。运算符=~ 在其右侧接受正则表达式,没有任何分隔符:没有引号,没有斜杠。如果你想找到pptp,那应该是唯一的:

[[ "<pptp-hennopsview>" =~ pptp ]]

是你可能想要做的。

编辑:我不知道为什么我写了“没有引号”。

【讨论】:

  • 如果这真的您将使用的格式,您也不确定您希望/g 完成什么。在sed 中,s 命令有一个/g 选项,表示替换一行中的每个匹配项,而不仅仅是第一个;但是对于匹配,你几乎不关心是否有一个匹配,或者不止一个。
  • 另外[pptp] 表示包含p 或p 或t 或p,或更简单地说,包含p 或t[ ] 表示法只匹配单个字符。
  • @cdarke:确实。这是你通常用大多数其他语言写成/[pptp]/(好吧,就像/[pt]/,真的:P)。它在这里看起来很奇怪,因为bash 不想要你的斜线,大多数其他语言都用它来构造正则表达式文字。
  • 大多数语言?不是 grep、C、C++、C#、Java、Python 或 Ruby。 SFAIK 仅 sed、awk、perl 和 PHP PCRE 使用 / /(旧的 PHP RE 引擎没有)。那些这样做的人之间有直接的进化路线 - 他们共享一个共同的基因。
  • @cdarke:Ruby 使用斜线文字(虽然也有其他的写法,但不太常用)。你错过了 JavaScript,它是当今非常重要的语言。此外,C、C++、Java 和 Python 没有正则表达式文字:它们使用字符串文字,然后将其转换为正则表达式或用作正则表达式。几乎所有确实具有正则表达式文字的语言都使用斜杠(elisp 是一个值得注意的例外,AFAIK)。
【解决方案2】:

以下解决了我的问题:

if [ "<pptp-Hamanskraal>" != "2 - LAN" ] && [ "<pptp-Hamanskraal>" != "1 - WAN" ] && [ "<pptp-hennopsview>" != "Cross Connect" ]; then if [[ "<pptp-hennopsview>" =~ "pptp-" ]]; then ssh admin@192.168.0.1 ':put [/interface pptp-server get [/interface pptp-server find name="<pptp-hennopsview>"] client-address ]'; else ssh admin@192.168.0.1 ':put [/interface eoip get [/interface eoip find name="<pptp-hennopsview>"] remote-address]'; fi else echo "No Match"; fi

以下解决了我所有的问题

[[ "<pptp-hennopsview>" =~ "pptp-" ]]

谢谢。

【讨论】:

  • 你为什么要比较文字?如果它们不包含变量,这些测试将始终给出完全相同的结果。
猜你喜欢
  • 1970-01-01
  • 2022-10-24
  • 2013-09-13
  • 2019-12-11
  • 2019-11-28
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 2011-08-21
相关资源
最近更新 更多