2015-04-21 2 views
0

Я пытаюсь создать функцию в скрипте bash, который запрашивает файл журнала. В функции запроса, у меня есть что-то, похожее на следующее:Bash: использование цитируемой переменной для grep в выражении с кавычками

if [ -n "$(cat some-log-file.log | grep \"$1\")" ]; then 
    echo "There is a match." 
else 
    echo "No lines matched the search term." 
fi 

Если я посылаю что-то я знаю, будет находиться в файле журнала, как $ 1, как «я не», я получаю выход:

$ ./y.sh запрос «Я не»
Grep: не ": нет такого файла или каталога
нет линий соответствует поисковому запросу

Если я пытаюсь одной цитатой $.(), он отправляет литеральную строку и всегда оценивает значение true. Я предполагаю, что это имеет какое-то отношение к способу grep inte rprets обратная косая черта, но я не могу понять это. Возможно, я наблюдаю за чем-то простым, но я часами смотрю на форумы и подключаю всевозможные странные комбинации цитат и персонажей-побегов. Любая помощь или совет приветствуются.

ответ

3

Это на самом деле очень легко, если вы понимаете, что $() разрешено иметь неэкранированные кавычки:

if [ -n "$(cat some-log-file.log | grep "$1")" ]; then 
    echo "There is a match." 
else 
    echo "No lines matched the search term." 
fi 

Вы действительно можете пропустить этот шаг, хотя, потому что grep дает соответствующий код выхода:

if grep -q "$1" some-log-file.log; then 
    echo "There is a match." 
else 
    echo "No lines matched the search term." 
fi 

Короче говоря, это происходит по той же причине, что и "$1": Расширение параметра Shell и замена команд происходят be fore расщепление слов и удаление цитат. Подробнее о том, как bash анализирует команды в Shell Expansions section of the bash manual.

+0

Спасибо тонну. Оба решения работали красиво, но я пользуюсь вторым. – shloosh

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