옵션 1: 이름으로만 변수 읽기

옵션 1: 이름으로만 변수 읽기

다음과 같은 속성이 포함된 JSON 파일이 있습니다.

{
  "environment": "$USER"
}

jq다음을 사용하여 값을 추출합니다.

ENVIRONMENT="$(jq -r '.environment' "properties.json")"

내가 원하는 값은 ENVIRONMENT내 사용자 이름입니다.아니요문자열 $USER- 이것이 가능합니까?

답변1

옵션 1: 이름으로만 변수 읽기

bash변수를 참조하는 변수를 가질 수 있습니다. 예를 들면 다음과 같습니다.

REF='USER'  # or get it from JSON
echo "${!REF}"
# prints current username

따라서 다음과 같이 작성할 수 있습니다.

ENVIRONMENT_REF="$(jq -r '.environment' "properties.json")"
ENVIRONMENT="${!ENVIRONMENT_REF}"

JSON 콘텐츠:

"environment": "USER"

옵션 2: 전체 셸 확장

다른 옵션이 더 나을 수도 있습니다(그러나절대 안전하지 않아요)다음을 사용하고 있습니다 eval:

ENVIRONMENT="$(eval "echo $(jq -r '.environment' "properties.json")")"

이는안전하지 않음그리고 JSON 파일에는 악성 코드가 삽입될 수 있습니다. 어떤 악성코드인가요? 이 파일을 살펴보겠습니다 properties.json.

{
    "environment": "$(rm some_file)" 
}

쉘은 eval다음 코드를 사용합니다:

echo $(rm some_file)

...지정된 파일이 some_file삭제됩니다. 보시다시피, 거기에 입력하는 명령에 따라 꽤 심각한 피해를 입힐 수 있습니다.

답변2

jq$ENVPerl의 $ENV해시 또는 awk의 ENVIRON연관 배열 과 유사한 객체를 통해 환경에 대한 액세스를 제공합니다 . 예를 들어 (허용된 답변에서 알 수 있듯이) Properties.json 파일이 다음과 같다고 가정합니다.

{
  "environment": "USER"
}

그럼 넌 할 수 있어

$ environment="$(jq -r '$ENV[.environment]' properties.json)"
$ echo "$environment"
steeldriver

(쉘 변수에 모두 대문자를 사용하지 않는 것이 가장 좋습니다). 파일이 다음과 같은 경우

{
  "environment": "$USER"
}

셸 확장이 포함되어 있으면 $이를 제거한 후 동일한 방법을 사용할 수 있습니다 $.

environment="$(jq -r '$ENV[.environment | sub("^\\$";"")]' properties.json)"

또는 외부 명령을 통해 간단한 찾기 결과를 전달할 수 있습니다 envsubst.

$ environment="$(jq -r '.environment' properties.json | envsubst)"
$ echo "$environment"
steeldriver

예시 보기파일의 환경 변수를 실제 값으로 바꾸시겠습니까?

답변3

이게 딱 맞아 다른 답변 중 하나.

Linux 터미널에서 로컬 폴더를 만듭니다.

$ mkdir -p ~/unix.se/jq/ && cd ~/unix.se/jq/

파일 만들기 properties.json:

$ echo '{"environment":"USER"}'>properties.json && cat properties.json
{"environment":"USER"}

추신 - 좋은 형식 jq:

$ jq '.' properties.json
{
  "environment": "USER"
}

JSON 키 값을 사용하여 environment새 환경 변수를 설정 하고 해당 내용을 표시합니다. 1

$ JQ_USER=$(jq -r '$ENV[.environment]' properties.json) && echo $JQ_USER
tedly

지금까지는 괜찮았지만 문제는 제가 거짓말을 해왔다는 것입니다. (!) - 파일이 properties.json올바르지 않은 것 같습니다.상당히위에서 언급했듯이 앞에는 다음과 같은 달러 기호가 있기 때문입니다 USER.

$ echo '{"environment":"$USER"}'>properties.json && cat properties.json
{"environment":"$USER"}

방해가 되는 달러 기호를 제거하면(예: 빈 문자열로 대체) 이미 작동하는 솔루션으로 돌아갈 수 있습니다.

$ JQ_USER=$(jq -r '$ENV[.environment | sub("\\$";"")]' properties.json)
echo $JQ_USER
tedly

1 이 프로그램을 처음 실행했을 때 로 끝나는 메시지를 받았습니다 jq: error: ENV/0 is not defined at <top-level>.$ENV[] 버전 1.6 필요(또는 그 이후) jq.

답변4

한 가지 접근 방식은 다음과 같습니다.

ENVIRONMENT=$(printenv $(jq -r '.environment' properties.json |
cut -c2-))

관련 정보