다음과 같은 속성이 포함된 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
$ENV
Perl의 $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-))