Bash를 사용하여 json 데이터 구문 분석

Bash를 사용하여 json 데이터 구문 분석

mysql 테이블 필드에 저장된 데이터를 기반으로 일부 명령을 생성하고 싶습니다.

데이터를 가져와 변수에 저장하려면 다음을 수행합니다.

modules=$(/usr/bin/mysql  -u $MyUSER -p$MyPASS $DB_NAME -e "SELECT modules FROM myapp WHERE ID=31 " -B  -N)

데이터베이스에서 데이터는 json 형식으로 저장됩니다.

["module-name-1","module-2","https:\/\/domain.com\/module\/packages\/mailmdule.zip"]

이 목록의 각 요소를 반복하고 아래와 같은 명령을 사용하여 줄을 생성하고 싶습니다.

install module-name-1 -yes --no-prompt 
install module-2 -yes --no-prompt 
install https://domain.com/module/packages/mailmdule.zip -yes --no-prompt

마지막 명령의 URL 형식은 json의 형식과 다릅니다.

나는 성공하지 못한 채 jq를 통해 솔루션을 찾고 있었으며 깨끗한 출력을 얻으려고 노력했습니다.

$((/usr/bin/mysql  -u $MyUSER -p$MyPASS $DB_NAME -e "SELECT modules FROM myapp WHERE ID=31 " -B  -N)| jq '.[]'))

하지만 난 단지 얻을 뿐이야

"module-name-1" "module-2" "https:\/\/domain.com\/module\/packages\/mailmdule.zip"

어떤 제안이라도 대단히 감사하겠습니다.

답변1

jq -r '.[] | @sh "install \(.) -yes --no-prompt"'

그러면 배열이 가져와서 출력되는 문자열에 요소(셸에 대해 올바르게 인용됨)가 삽입됩니다.

표시된 배열을 고려하면 다음과 같습니다.

install 'module-name-1' -yes --no-prompt
install 'module-2' -yes --no-prompt
install 'https://domain.com/module/packages/mailmdule.zip' -yes --no-prompt

작은따옴표, 공백 등이 포함된 배열 요소는 올바르게 처리됩니다.

셸에서 이러한 명령을 실행하려면 다음으로 파이프하십시오 sh -s.

jq -r '.[] | @sh "install \(.) -yes --no-prompt"' | sh -s

또는 다음 install에서 유효한 명령을 구성하는 대신 배열에서 데이터를 읽고 명령줄에서 해당 데이터를 사용하는 쉘 루프를 실행할 수 있습니다.jq

jq -r '.[]' |
while IFS= read module; do
    install "$module" -yes --no-prompt
done

배열 요소에 줄 바꿈이 포함되어 있으면 분명히 작동하지 않습니다.

관련 정보