Передача переменной 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')"

В моем случае мне нужно было использовать двойные кавычки и кавычки для доступа к значению переменной.

Приветствия.