Bash字符串与/前导零比较

时间:2013-10-03 22:36:43

标签: regex bash

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

#!/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 个答案:

答案 0 :(得分:3)

从字符串中去除任何前导零,然后检查结果是否相等。此解决方案需要bash的扩展模式支持。

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

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

if [[ $STR1 =~ 0*$STR2 || $STR2 =~ 0*$STR1 ]]; then
    echo "Strings are equal"

答案 1 :(得分:1)

此解决方案使用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  

答案 2 :(得分: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

答案 3 :(得分:0)

如果您完全确定字符串是数字,则应使用-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。在这种情况下,我使用=进行测试,测试字符串等效性。