只是想知道在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
答案 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
。在这种情况下,我使用=
进行测试,测试字符串等效性。