2013-04-10 4 views
2

У меня проблема с оператором if в моем сценарии bash. Цель: мне нужно проверить значение 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 

Спасибо,

+0

Используйте одинарные кавычки вокруг регулярного выражения. – jordanm

ответ

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 
+0

Или, в общем случае, используйте смежные строки с разными кавычками. '' foo '' '' bar'' правильно цитирует строку 'foo '' bar' - это' foo'' в двойных кавычках, расположенных рядом с '' bar' в одинарных кавычках. – tripleee

+0

Весело альтернативный способ поставить двойную кавычку буквально внутри двойных кавычек: «Бла-бла-бла» «« »« цитата »« »« бла-бла », которая является« бла-бла-бла »в двойных кавычках, а затем« »в одиночных кавычках, а затем« бла blah' в двойных кавычках. Это будет интерпретироваться как «бла-бла-бла» цитата «blah blah' – Lorkenpeist

+0

' '

0

попытался это, кажется, работает хорошо

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

внутренние двойные кавычки должны быть приняты как буквальный. Таким образом, обратная косая черта перед ними сообщает bash, что они не начинаются или не заканчиваются нитью

+0

Привет, Благодарю всех вас за ответы, очень благодарен. Я пошел с единственным предложением кавычек, поскольку это был самый простой способ реализовать. –

Смежные вопросы