echo "abc-vcu def" | grep -w "abc.vcu"
echo $?
上面一行的输出为0
。但abc-vcu
= abc.vcu
和def
= abc.vcu
。所以它应该返回1
。
Command返回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。
grep中.
表示任意字符(正则表达式语法)
如果您需要匹配.
,请尝试.
echo "abc-vcu def" | grep -w "abc.vcu"
echo $?
如果您想在这种情况下使用grep
,请按如下方式使用:
echo "abc-vcu def" | grep -F -w "abc.vcu"
man grep
表示使用-F
grep必须
将PATTERN解释为固定字符串列表
这修复了.
被识别为'任意符号'模式的问题。
您可以让bash
来代替使用grep
,特别是如果您打算使用变量:
string1='abc-vcu def'
string2='abc.vcu'
[[ ! ${string1/*${string2}*/} ]]
echo $?
[[ expression ]]
返回0
或1
,这取决于expression
的求值。
!
是逻辑非。
${parameter/pattern/string}
用string
取代parameter
中第一个出现的pattern
,其中pattern
被展开,就像在路径名展开中一样。对于上述情况,这意味着如果$string2
出现在$string1
中的任何位置,$string1
将完全被''
(一个空字符串)所取代,这是一个逻辑假。