Как передать переменную сценария bash в --arg? - PullRequest
0 голосов
/ 08 апреля 2020

Я попытался проанализировать базу данных сонара проекта, используя оператор jq if с test и regex, как это

jq -r 'if (.name | test("\\.example\\.com$")) then . else empty end'

, и в форме сценария я попытался это

zcat sonar.json.gz | jq --arg a "$b" -r 'if (.name | test($a)) then . else empty end'

, пока b = "\. example \ .com $"

(здесь я фактически использовал sed для создания регулярных выражений из пользовательского ввода).

Если я запускаю его, я не получаю вывод. Если я установлю --arg a \\. Example \\. Com $, это будет работать.

Есть ли проблема чтения при синтаксическом анализе переменных сценария как регулярного выражения?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Использование bash:

$ b="\.example\.com$" jq -n 'env.b'
"\\.example\\.com$"

$ b='.example.com$' jq -n 'env.b'
".example.com$"

$ jq -n --arg b '\.example\.com$'  '$b'
"\\.example\\.com$"

$ export b='\.example\.com$'
$ jq -n 'env.b'
"\\.example\\.com$"

$ jq -n --argjson b '".example.com$"' '$b'
".example.com$"
0 голосов
/ 08 апреля 2020

Я подозреваю, что ваша проблема кроется где-то в кавычках.

Вы не предоставили достаточно информации о своих входных данных для точного ответа, но вот простой bash скрипт, который запускается jq с использованием шаблона прошло с --arg, с которым вы можете поэкспериментировать. Обратите внимание на использование одинарных кавычек в присваивании A.

#!/bin/bash
A='\.example\.com$'
echo A is $A
jq -M --arg a "$A" 'select(.value | test($a))'

С учетом следующего ввода

{ "value": "foo" }
{ "value": "foo.example.com" }

Получается

A is \.example\.com$
{
  "value": "foo.example.com"
}

(заметьте, я обычно использую -M для гарантии того, что в вывод не добавляется окраска)

Попробуйте онлайн!

...