Передайте переменную строковых значений, разделенных запятыми, в фильтр аргументов jq

#bash #jq #github-actions

#bash #jq #github-действия

Вопрос:

Я пытаюсь отфильтровать данные из файла json с помощью jq с фильтром, основанным на динамическом списке значений из скрипта Bash.

Следующая команда jq работает сама по себе:

 jq -r '.[] | select(.name==("value1","value2"))' file.json
 

В Bash следующая команда работает, если я устанавливаю для переменной одно значение и передаю его в

 testValue="value1"
result=$(jq -r --arg TESTVALUE "$testValue" '.[] | select(.name==($TESTVALUE))' file.json)
echo "$result"
 

Если я установлю для переменной список значений, разделенных запятыми, и передам его, он не вернет результатов

 testValues=""value1", "value2""
result=$(jq -r --arg TESTVALUES "$testValues" '.[] | select(.name==($TESTVALUES))' file.json)
echo "$result"
 

Я новичок в написании сценариев bash, поэтому я уверен, что мне не хватает чего-то простого в том, как интерпретируется переменная. Я включил файл.также ниже приведен json.

 [
    {
        "name": "value1",
        "test": "blah1"
    },
    {
        "name": "value2",
        "test": "blah2"
    }
]
 

Комментарии:

1. Весь смысл --arg в том, чтобы передать ваш контент в виде данных, чтобы его нельзя было неверно истолковать как код или синтаксис.

2. … принимая во внимание, что когда вы добавляете кавычки и запятые, это синтаксис.

3. … если вы хотите передать список, затем передайте фактический список — используйте --argjson и перепишите свой запрос для работы с ним.

4. (и не используйте -r , когда вы выдаете JSON вместо необработанных строковых данных в качестве выходных данных).

5. Добро пожаловать в SO и спасибо за включение короткого, простого, автономного примера (MCVE)! Это упрощает работу как для людей, отвечающих сейчас, так и для будущих читателей, которые столкнутся с этим вопросом.

Ответ №1:

--arg будет обрабатывать ваше значение как буквальную строку, поэтому кавычки и запятые не будут иметь никакого эффекта.

Вместо этого вы можете отформатировать свой список как действительный список JSON и использовать --argjson :

 testValues='[ "value1", "value2" ]'
jq --argjson TESTVALUES "$testValues" '.[] | select(.name==($TESTVALUES[]))' file.json
 

Или, возможно, даже лучше, укажите какой-нибудь разделитель и попросите jq вместо этого разделить вашу строку, чтобы вам не приходилось беспокоиться об экранировании JSON:

 testValues='value1,value2'
jq --arg TESTVALUES "$testValues" '.[] | select(.name==($TESTVALUES | split(",")[]))' file.json
 

Комментарии:

1. Это сработало отлично! Благодарим вас за решение, а также за предоставление 2 различных способов достижения этой цели.