==
сравнивает ссылки на объекты в Java и не является исключением для объектов String
.
Для сравнения фактического содержимого объектов (в том числе String
) необходимо использовать equals
.
Если сравнение двух объектов String
с использованием ==
оказывается true
, это связано с тем, что объекты String
были интернированы, а виртуальная машина Java имеет несколько ссылки указывают на тот же экземпляр String
. Не следует ожидать сравнения одного объекта String
, содержащего то же содержимое, что и другой объект String
, используя ==
для оценки как true
.
Рассмотрим также переход в переменную оболочки (EMAILID) как переменную jq (здесь также EMAILID, для иллюстрации):
projectID=$(cat file.json | jq -r --arg EMAILID "$EMAILID" '.resource[]
| select(.username==$EMAILID) | .id')
Для записи , другой возможностью было бы использовать функцию env
jq для доступа к переменным среды. Например, рассмотрим эту последовательность команд bash:
EMAILID=foo@bar.com # not exported
EMAILID="$EMAILID" jq -n 'env.EMAILID'
Выход представляет собой строку JSON:
"foo@bar.com"
Еще один способ выполнить это с флагом 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
Я решил эту проблему, избегая внутренних двойных кавычек
projectID=$(cat file.json | jq -r ".resource[] | select(.username==\"$EMAILID\") | .id")
Это проблема с цитатой, вам нужно:
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
jq
правильно создать фильтр с использованием значения, а не использоватьbash
для создания строки, которуюjq
интерпретирует как фильтр. (Посмотрите, что произойдет, если значениеEMAILID
содержит)
.) – chepner 16 October 2016 в 02:35