bash 스크립트에서 json의 키-값 쌍 값을 동적으로 찾는 방법

bash 스크립트에서 json의 키-값 쌍 값을 동적으로 찾는 방법

저는 bash 스크립팅을 처음 접했습니다. 목록을 반복하면서 JSON 개체에서 값을 가져오고 싶습니다. 나는 이 3가지를 모두 시도했고, 얻었습니다.jq: 1 compile error

올바른 구문은 무엇입니까?

for key in $KEYS
  echo "ALIASES:" $ALIASES
  # ALIASES: {'a': 'apple', 'b': 'bananna'}

FRUIT=$(echo $ALIASES | jq ."$key" -r)
FRUIT=$(echo $ALIASES | jq .'$key' -r)
FRUIT=$(echo $ALIASES | jq .$key -r)

답변1

주요 문제는 다음과 같은 이유로 json 데이터에 있는 것 같습니다.

{'a': 'apple', 'b', 'bananna'}

내가 아는 한, 작은따옴표를 사용하는 것은 유효하지 않습니다(큰따옴표 사용).JSON 형식.
내가 본 또 다른 문제는 ,와 사이에 쉼표가 있다는 것입니다. (당신이 이것을 눈치 채지 못하고 대신 입력했다고 가정합니다)'b''bannana',:

따라서 json 데이터는 다음과 같아야 합니다.

{"a": "apple", "b": "bananna"}

키를 얻는 올바른 구문은 무엇입니까?

나는 일반적으로 구문이 '.key'훨씬 더 많이 사용되는 것을 봅니다. 하지만 제 생각에는 효과가 있는 것은 무엇이든 사용해야 한다고 생각합니다. 예를 들어, $keyjson 키에서 특정 값을 가져오기 위해 변수를 사용하고 있는 것을 볼 수 있습니다 . 따라서 다음과 같은 것을 사용해야 합니다 ".$key". 또는 아마도 ."$key", .$key(이것이 권장되는지 확실하지 않습니다):

솔루션 1

FRUIT=$(echo $ALIASES | jq ".$key" -r)
#or
FRUIT=$(echo $ALIASES | jq ."$key" -r)
#or
FRUIT=$(echo $ALIASES | jq .$key -r)

사용하거나 사용하려는 경우 변수 값을 명령 single quotes에 전달할 수 없습니다 . jq에 따르면 man bash:

문자를 작은따옴표(')로 묶으면 따옴표 안의 각 문자의 리터럴 값이 유지됩니다. 앞에 백슬래시가 있더라도 작은따옴표 사이에는 작은따옴표를 사용할 수 없습니다.

따라서 일부 키를 지정하여 json 값을 사용하려면 single quotes다음을 사용해야 합니다.

FRUIT=$(echo $ALIASES | jq '.somekey' -r)
#e.g.
FRUIT=$(echo $ALIASES | jq '.a' -r)
echo $FRUIT
#Output:
apple

당신은 확인할 수 있습니다이 답변더 잘 이해 single quotes하고double quotes

해결 방법 2(jq --arg 사용)
위 코드가 왜 작동하지 않는지 잘 모르겠습니다(큰따옴표 사용). 그러나 변수를 에 전달하는 또 다른 가능한 솔루션이 있습니다. jq시도해 볼 수 있습니다.

val="a"
echo $ALIASES | jq --arg key "$val" '.[$key]' -r

Python을 사용하여 json을 가져오는 경우 다음 방법을 사용해야 합니다 json.dumps(your_json). 예:

python3 -c 'import json;aliases = json.load(open("file"));print(json.dumps(aliases))'

관련 정보