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
배열 요소에 줄 바꿈이 포함되어 있으면 분명히 작동하지 않습니다.