如何比较两个字符串但忽略空格?我正在做以下事情:
if [ "$a" == "$b" ]; then
echo ok
fi
但似乎并不匹配。我已经打印了“a”和“b”是什么,它们是相同的。不过,他们似乎使用了不同的换行符。
答案1
从技术上讲,要忽略所有空格,您可以传递两个字符串tr
:
[ "$(echo "$a" | tr -d '[:space:]')" = "$(echo "$b" | tr -d '[:space:]')" ]
但是,通过这种方式,在比较之前所有空格都会被删除,因此例如"a b"
和"ab"
将测试相等。我不确定这是否可取。您可以调整tr
过滤器来执行您需要的操作。例如,要仅删除所有风格的换行符,您可以这样做tr -d '\n\r'
。
答案2
在 bash 中,您可以使用参数扩展语法获取删除了某些字符的变量值(或者更一般地替换模式的出现)。
if [[ "${a//[$' \t\n\r']/}" == "${b//[$' \t\n\r']/}" ]]; then
echo ok
fi
如果问题是它们“使用不同的换行符”,则可能意味着其中之一来自 Windows 文件。 Windows 行在$'\r
换行符 ( ) 之前有一个额外的 CR(bash 语法中的回车符) $'\n'
。如果你有多行字符串,你可以只去掉 CR 字符:
if [[ "${a//$'\r'/}" == "${b//$'\r'/}" ]]; then
echo ok
fi
如果变量是单行字符串,那么麻烦的 CR 将出现在末尾,您可以使用后缀剥离语法:
if [[ "${a%$'\r'}" == "${b%$'\r'}" ]]; then
echo ok
fi
如果您需要简单的 sh 格式,那么(较小的)困难是输入 CR 字符。
cr=$(printf '\r')
if [[ "${a%$cr}" == "${b%$cr}" ]]; then
echo ok
fi