#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 различных способов достижения этой цели.