echo "abc-vcu def" | grep -w "abc.vcu"
echo $?
上面一行的输出是0
。但是 abc-vcu
!= abc.vcu
和 def
!= abc.vcu
。所以它应该返回 1
。
命令返回 true 因为它假设 .
和 -
相同。如何进行精确比较?
最佳答案
通过简单的字符串比较可以更好地实现您的尝试。
if [[ "abc-vcu def" == *"abc.vcu"* ]]; then
echo "String B contained in String A"
else
echo "No containment"
fi
还要注意这如何避免检查 $?
的反模式。只是为了详细说明,任何看起来像的东西
command
if [ $? == 0 ]; then ...
最好写成
if command; then ...
顺便说一句,如果您确实想要或必须使用 grep
,则需要了解一些选项。 grep
匹配正则表达式,而不仅仅是字符串。有一个单独的选项可以将搜索表达式更改为字符串,即 -F
(传统上可作为单独的命令 fgrep
):
echo moo | grep m.o # true
echo moo | grep -F m.o # false
为了完整起见,还请注意 grep
在输入的任何位置查找匹配项。所以 echo moo | grep o
是真的。如果你真的想寻找完全匹配,你需要 -x
选项(或改变你正在寻找的表达式):
echo moo | grep -x moo
echo moo | grep '^moo$'
就像@Kent 所说的那样,grep
将默认打印任何匹配的行,您可能不希望在这里出现这种情况——您只是运行grep
来查看是否有是一场比赛。所以你还需要 -q
标志。总结一下,
echo "abc-vcu def" | grep -Fxwq "abc.vcu"
最后,您可能还应该了解case
:
case "abc-vcu def" in *"abc.vcu"*) echo true;; *) echo false;; esac
与 [[
仅 Bash 测试不同,case
可移植回原始 Bourne shell。
关于linux - 使用 grep 比较两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22631415/