如何在bash中将两个相似的字符串与通配符进行比较?

时间:2014-04-04 04:33:14

标签: bash string-comparison

如何在bash中最好地比较两个相似的字符串?

我想将1.1.1.1:10001.1.1.1进行比较,并将其视为匹配。

1.1.1.1:1000 1.1.1.1 MATCH
1.1.1.2:1000 1.1.1.1 NO MATCH

这是一个简单的脚本,说明了挑战:

#!/bin/sh

IPONE="1.1.1.1:1000"
IPTWO="1.1.1.1"

if  [[ "$IPONE" == "$IPTWO*" ]] ; then
    echo "$IPONE $IPTWO Match"
else
    echo "$IPONE $IPTWO ERROR"
fi

3 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望比较冒号之前部分的完全匹配。在那种情况下:

if  [[ "${IPONE%%:*}" == "${IPTWO%%:*}" ]] ; then
    echo "$IPONE $IPTWO Match"
else
    echo "$IPONE $IPTWO ERROR"
fi

答案 1 :(得分:1)

如果您想使用glob-syntax,那么您需要在=~中使用==而不是[[ ... ]],并且不能引用第二个参数。所以它应该是这样的:

if [[ "$IPONE" =~ $IPTWO* ]]; then

如果您需要引用第二个参数,请执行以下操作:

if [[ "$IPONE" =~ "$IPTWO"* ]]; then

如果您需要找到匹配字符串的匹配项,最后一个分隔符,在本例中为.,请尝试以下操作:

if [[ "$IPONE" =~ ([0-9]|\.){3}[0-1]* ]]; then

答案 2 :(得分:1)

我认为POSIX substring parameter expansion,可能有技巧

#!/bin/bash

IPONE="1.1.1.1:1000"
IPTWO="1.1.1.1"

if test "${IPONE#*$IPTWO}" != "$IPONE"
then
     echo "$IPONE $IPTWO Match"
else
     echo "$IPONE $IPTWO ERROR"
fi

OR

IPONE="1.1.1.1:1000"
IPTWO="1.1.1.1"

if [[ "${IPONE}" == *$IPTWO* ]]
then
     echo "$IPONE $IPTWO Match"
else
     echo "$IPONE $IPTWO ERROR"
fi