我的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
谢谢,
答案 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他们没有开始或结束字符串