Передача переменной bash в jq select
Я написал script для получения определенного значения из file.json
. Он работает, если я предоставляю значение jq select
, но переменная не работает (или я не знаю, как ее использовать).
#!/bin/sh
#this works ***
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="[email protected]") | .id')
echo "$projectID"
[email protected]
#this does not work *** no value is printed
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="$EMAILID") | .id')
echo "$projectID"
Ответы
Ответ 1
Рассмотрим также передачу переменной оболочки (EMAILID) в качестве переменной jq (здесь также EMAILID, для иллюстрации):
projectID=$(cat file.json |
jq -r --arg EMAILID "$EMAILID" '
.resource[]
| select(.username==$EMAILID)
| .id')
постскриптум
Для записи, другой возможностью было бы использовать функцию jq env
для доступа к переменным окружения. Например, рассмотрим следующую последовательность команд bash:
[email protected] # not exported
EMAILID="$EMAILID" jq -n 'env.EMAILID'
Выходные данные представляют собой строку JSON:
"[email protected]"
Ответ 2
Это вопрос цитаты, вам нужно:
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
Ответ 3
Я решил эту проблему, избегая внутренних двойных кавычек
projectID=$(cat file.json | jq -r ".resource[] | select(.username==\"$EMAILID\") | .id")
Ответ 4
Другой способ добиться этого - с флагом jq "--arg".
Используя исходный пример:
#!/bin/sh
#this works ***
projectID=$(cat file.json | jq -r '.resource[] |
select(.username=="[email protected]") | .id')
echo "$projectID"
[email protected]
# 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
Ответ 5
Я знаю, это немного позже, чтобы ответить, извините. Но это работает для меня.
export K8S_public_load_balancer_url="$(kubectl get services -n ${TENANT}-production -o wide | grep "ingress-nginx-internal$" | awk '{print $4}')"
И теперь я могу получить и передать содержимое переменной в jq
export TF_VAR_public_load_balancer_url="$(aws elbv2 describe-load-balancers --region eu-west-1 | jq -r '.LoadBalancers[] | select (.DNSName == "'$K8S_public_load_balancer_url'") | .LoadBalancerArn')"
В моем случае мне нужно было использовать двойные кавычки и кавычки для доступа к значению переменной.
Приветствия.