只是想知道在 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
从字符串中去除所有前导零,然后检查结果是否相等。此解决方案需要来自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"
这就是我要做的:
#!/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
显而易见且微不足道的解决方案是明确指出数字的基数。那么任何前导零都是无关紧要的,因为这些数字不会被解释为八进制。
if [[ 10#$STR1 -eq 10#$STR2 ]]; then
echo "Numbers are equal"
else
echo "Numbers are NOT equal"
fi
还要注意-eq
数字比较的开关。
如果您绝对确定您的字符串是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 测试字符串等效性。
此解决方案用于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