如果语句匹配包含双引号的字符串

时间:2013-04-10 04:31:40

标签: string bash if-statement grep double-quotes

我的bash脚本中有if语句的问题。 目标:我需要检查clustered的值,但由于它不是唯一的名称,我决定尝试匹配整个字符串。例如,要在此处查找clustered是否为真/假,if将查找整个“相邻”字符串。

问题:虽然下面的if语句适用于某些字符串,但它实际上不适用于下面的值。我怀疑这是因为"false"附近的双引号。

是否可以更改此if,以便它可以正常工作(即接受额外的双引号)?

我的bash:

if grep -Fxq "<cache clustered="false" " confg.xml
then
    echo "Correct value"
    # code if found
else
    echo "Incorrect value"
    # code if not found
fi

谢谢,

2 个答案:

答案 0 :(得分:2)

问题在于,您正在使用的字符串周围使用双引号,以及字符串本身。 Bash通过将每个双引号与下一个双引号匹配来解释引号,而不是最后一个。如果引号是括号,那么当你真正想要的是if grep -Fxq (<cache clustered=)false( ) confg.xml时,你的第一行看起来就像if grep -Fxq (<cache clustered=(false) ) confg.xml。换句话说,内部双引号不会被解释为文字双引号。如果您希望按字面解释它们,请将grep表达式用单引号而不是双引号括起来:

if grep -Fxq '<cache clustered="false" ' confg.xml

答案 1 :(得分:1)

试过这个,似乎工作正常

bash$ cat log; if grep -Fxq "<cache clustered=\"false\"" log ; then echo "got it"; else echo "missed"; fi
<cache clustered="false"
got it

内部双引号需要视为字面值。因此,他们前面的反斜杠通知bash他们没有开始或结束字符串