2016-12-26 1 views
-2

У меня есть скрипт, где у меня есть заявление:Переменная не получает назначается в Баш после завиток ударил

isPartial = $searchCurl| grep -Po '\"partialSearch\":(true|false)'|sed 's/\\\"partialSearch\\\"://' 

теперь, если я просто эхо RHS

$searchCurl| grep -Po '\"partialSearch\":(true|false)'|sed 's/\\\"partialSearch\\\"://' 

он печатает "partialSearch":true, но переменная isPartial не инициализируется.

Почему это происходит и как я могу это исправить?

+0

Вы хотите [подстановка команды] (https://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution): 'isPartial = $ (...)'. –

ответ

1

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

sometext... "partialSearch":true ... sometext... 
..bla bla bla... "partialsearch":false ... 

и мои примеры ниже, будет работать в этом предположении.

Существует несколько моментов.

  • Вы, кажется, пытаетесь разобрать ввод JSON с регулярными выражениями. Хотя это может быть приемлемо для быстро и грязных одноразовых заданий, где вы знаете точный формат обрабатываемых данных, в целом это плохая идея . Вы должны использовать парсер JSON, например jq.

  • Очевидно, что вы сохранили некоторый код bash в переменной searchCurl. Это считается плохой практикой. Вместо searchCurl="... code ..." вы должны сделать function searchCurl() { ... code ... } и позвонить по номеру searchCurl, не указав знак доллара. Переменные для значений, функции для кода.

  • В большинстве случаев, если вы собираетесь использовать sed, лучше использовать его для всех, не вызывая grep. Иногда проще иметь и то, и другое. Ниже приведен пример.

  • Чтобы назначить вывод команды переменной, вы должны использовать подстановку команд.

Короче говоря, если в вашем входном тексте имеется только один матч '"partialSearch":(true|false)', это то, что вы хотите:

isPartial=$(searchCurl|sed -rn 's/^.*"partialSearch":(true|false).*$/\1/p') 

Если у вас есть еще и ввод текста одна большая линия, как я предположим, использование grep -o может упростить задачу разделения входа в один матч на линии, так что

isPartial=$(searchCurl|grep -Po '"partialSearch":(true|false)'|sed -e 's/^.*://') 

может быть то, что вы хотите (и в этом случае, isPartial будет содержать разделенный пробелами список true и false).

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

  • Нет связанных вопросов^_^