2

只是想知道在 bash 脚本中是否有一种简单的方法来使用“测试”结构来比较与给定模式匹配的两个字符串。在这种特殊情况下,如果它们前面有前导零,我希望一对数字字符串匹配。谢谢。

#!/bin/bash

STR1=123
STR2=00123

if [[ "0*${STR1}" == "0*${STR2}" ]]; then
    echo "Strings are equal"
else
    echo "Strings are NOT equal"
fi

exit 0
4

5 回答 5

3

从字符串中去除所有前导零,然后检查结果是否相等。此解决方案需要来自bash.

shopt -s extglob
if [[ "${STR1##*(0)}" = "${STR2##*(0)}" ]]; then
   echo "Strings are equal"
fi

您也可以使用bash的内置正则表达式支持,但如果您不知道哪个字符串有更多的前导 0,则可能需要两次比较。当左侧字符串的前导 0 至少与右侧字符串一样多时,该测试有效。

if [[ $STR1 =~ 0*$STR2 || $STR2 =~ 0*$STR1 ]]; then
    echo "Strings are equal"
于 2013-10-03T23:15:40.427 回答
1

这就是我要做的:

#!/bin/bash

STR1=123
STR2=00123

if [ `echo -n ${STR1} | sed 's/^0*//g'` == `echo -n ${STR2} | sed 's/^0*//g'` ]; then
    echo "Strings are equal"
else
    echo "Strings are NOT equal"
fi

exit 0
于 2013-10-03T22:51:15.587 回答
1

显而易见且微不足道的解决方案是明确指出数字的基数。那么任何前导零都是无关紧要的,因为这些数字不会被解释为八进制。

if [[ 10#$STR1 -eq 10#$STR2 ]]; then
    echo "Numbers are equal"
else
    echo "Numbers are NOT equal"
fi

还要注意-eq数字比较的开关。

于 2021-12-08T10:13:48.650 回答
0

如果您绝对确定您的字符串是numeric,那么您应该使用-eq而不是==

if [ $string1 -eq $string2 ]
then
    echo "These are equal"
fi

-eq不关心前导零

问题是,如果两个字符串都不是数字(或一个字符串等于零而另一个不是数字),这仍然有效:

string1=foo
string2=bar
if [ $string1 -eq $string2 ]
then
    echo "These are equal"  # This will print, and it shouldn't!
fi

我看到解决此问题的唯一方法是执行以下操作:

if expr $string1 + 0 > /dev/null 2&1 && expr $string2 + 0 > /dev/null 2>&1
then  # Both strings are numeric!
    if [ $string1 -eq $string2 ]
    then
        echo "Both strings are numeric and equal."
    else
        echo "Both strings are numeric, but not equal."
elif [ $sring1 = $sring2 ]
then
    echo "Strings aren't numeric, but are the same
else
    echo "Strings aren't numeric or equal to each other"
fi

如果字符串不是数字,expr则将返回非零退出代码。我可以在我的测试中使用它if来测试我的字符串是否实际上是数字。

如果它们都是数字,我可以用我的第二个if-eq测试整数等价性。前导零没有问题。

elif在我的字符串不是数字的情况下使用。在这种情况下,我使用=which 测试字符串等效性。

于 2013-10-04T03:13:00.337 回答
0

此解决方案用于expr将字符串转换为数值。请注意,另一种 bash 方法 - 双括号 - 不起作用,因为带有前导零的值被解析为八进制值。例如

STR1=000123
echo $(($STR1))  # outputs 83

解决方案

#!/bin/bash
STR1="00123"
STR2="0000123"

n1=$(expr $STR1 + 0)
n2=$(expr $STR2 + 0)
if [ $n1 -eq $n2 ];then
    echo "Strings are equal"
else
    echo "Strings are NOT equal"
fi
exit 0  
于 2013-10-03T22:47:31.937 回答