3

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

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

是否有可能改变它if,所以它会起作用(即接受额外的双引号)?

我的狂欢:

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

谢谢,

4

2 回答 2

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
于 2013-04-10T04:41:10.380 回答
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 他们不是字符串的开始或结束

于 2013-04-10T06:04:13.290 回答