如何在bash中最好地比较两个相似的字符串?
我想将1.1.1.1:1000
与1.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
答案 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