Передача строки bash с пробелами в jq [duplicate]

== сравнивает ссылки на объекты в Java и не является исключением для объектов String.

Для сравнения фактического содержимого объектов (в том числе String) необходимо использовать equals.

Если сравнение двух объектов String с использованием == оказывается true, это связано с тем, что объекты String были интернированы, а виртуальная машина Java имеет несколько ссылки указывают на тот же экземпляр String. Не следует ожидать сравнения одного объекта String, содержащего то же содержимое, что и другой объект String, используя == для оценки как true.

24
задан Benjamin W. 4 December 2017 в 18:21
поделиться

4 ответа

Рассмотрим также переход в переменную оболочки (EMAILID) как переменную jq (здесь также EMAILID, для иллюстрации):

   projectID=$(cat file.json | jq -r --arg EMAILID "$EMAILID" '.resource[]
                               | select(.username==$EMAILID) | .id')

Postscript

Для записи , другой возможностью было бы использовать функцию env jq для доступа к переменным среды. Например, рассмотрим эту последовательность команд bash:

EMAILID=foo@bar.com  # not exported
EMAILID="$EMAILID" jq -n 'env.EMAILID'

Выход представляет собой строку JSON:

"foo@bar.com"
31
ответ дан peak 15 August 2018 в 21:07
поделиться
  • 1
    Это единственный 100% -ый ответ; он позволяет jq правильно создать фильтр с использованием значения, а не использовать bash для создания строки, которую jq интерпретирует как фильтр. (Посмотрите, что произойдет, если значение EMAILID содержит ).) – chepner 16 October 2016 в 02:35
  • 2
    Спасибо пик. ваше предоставленное решение - правильный ответ, который я искал. Да, это работает. – asidd 17 October 2016 в 13:39
  • 3
    У меня был номер, поэтому -argjson сделал трюк для меня – Simon Ernesto Cardenas Zarate 31 May 2018 в 00:00
  • 4
  • 5
    – animageofmine 2 October 2018 в 06:37

Еще один способ выполнить это с флагом jq "--arg". Используя исходный пример:

#!/bin/sh

#this works ***
projectID=$(cat file.json | jq -r '.resource[] | 
select(.username=="myemail@hotmail.com") | .id')
echo "$projectID"

EMAILID=myemail@hotmail.com

# Use --arg to pass the variable to jq. This should work:
projectID=$(cat file.json | jq --arg EMAILID $EMAILID -r '.resource[] 
| select(.username=="$EMAILID") | .id')
echo "$projectID"

См. Здесь, где я нашел это решение: https://github.com/stedolan/jq/issues/626

0
ответ дан Andrew Lockhart 15 August 2018 в 21:07
поделиться

Я решил эту проблему, избегая внутренних двойных кавычек

projectID=$(cat file.json | jq -r ".resource[] | select(.username==\"$EMAILID\") | .id")
3
ответ дан asidd 15 August 2018 в 21:07
поделиться

Это проблема с цитатой, вам нужно:

projectID=$(
  cat file.json | jq -r ".resource[] | select(.username=='$EMAILID') | .id"
)

Если вы поместите одинарные кавычки , чтобы разграничить основную строку, оболочка принимает $EMAILID буквально.

«Двойная кавычка» каждого литерала, содержащего пробелы / метасимволы, и разворота каждого : "$var", "$(command "$var")", "${array[@]}", "a & b". Используйте 'single quotes' для кода или литерала $'s: 'Costs $5 US', ssh host 'echo "$HOSTNAME"'. См. http://mywiki.wooledge.org/Quotes http://mywiki.wooledge.org/Arguments http: //wiki.bash-hackers. org / syntax / words

4
ответ дан Gilles Quenot 15 August 2018 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: