echo "abc-vcu def" | grep -w "abc.vcu"
echo $?
上述行的输出为0
。但是abc-vcu
!= abc.vcu
和def
!= abc.vcu
。所以它应该返回1
。
命令返回true,因为它假定.
和-
相同。如何进行精确比较?
答案 0 :(得分:2)
grep .
表示任何字符(正则表达式语法)
如果您需要匹配.
,请尝试\.
echo "abc-vcu def" | grep -w "abc\.vcu"
echo $?
答案 1 :(得分:1)
而不是使用grep
,您可以让bash
完成工作,特别是如果您打算使用变量:
string1='abc-vcu def'
string2='abc.vcu'
[[ ! ${string1/*${string2}*/} ]]
echo $?
[[ expression ]]
会返回0
或1
,具体取决于expression
的评估。
!
是逻辑而非。
${parameter/pattern/string}
将pattern
中parameter
的第一次出现替换为string
,其中pattern
的扩展与路径名扩展一样。对于上述情况,这意味着如果$string2
中出现$string1
,则$string1
完全被''
(空字符串)替换,这是逻辑错误
答案 2 :(得分:1)
如果您确实想在这种情况下使用grep
,请按以下方式使用它:
echo "abc-vcu def" | grep -F -w "abc.vcu"
man grep
说-F
grep必须
将PATTERN解释为固定字符串列表
这解决了.
被识别为'任何符号'的问题。图案。
答案 3 :(得分:0)
通过简单的字符串比较可以更好地实现您的尝试。
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。