작은따옴표로 매개변수를 사용하는 방법

작은따옴표로 매개변수를 사용하는 방법

ID가 포함된 파일이 있습니다.

123abc
456dbc

파일을 반복하면서 명령에 전달하고 싶습니다.

현재 내 명령은 다음과 같이 작동합니다. part_of_command '{"id":{"S":"123abc"}}'그러나 이제 파일이 있으므로 123abc를 파일의 각 줄에 있는 내용으로 바꾸고 싶습니다.

나는 비슷한 것을 성취하려고 노력하고 있습니다.

    while read line; do
   command '{"id":{"S":"$line"}}'
    done <output.txt

여기서 행은 123abc, 456dbc 또는 기타 ID입니다. 그러나 $line은 작은따옴표와 큰따옴표 오류를 발생시킵니다. 이 문제를 해결하는 방법을 아시나요?

답변1

중첩된 JSON 개체를 명령에 매개변수로 전달하려는 것 같습니다. 쉘은 작은따옴표 안에 변수를 확장하지 않습니다.

그러나 여기서 해결 방법은 큰따옴표를 대신 사용하지 않는 것입니다. JSON 문서에 삽입된 데이터를 유효한 JSON으로 인코딩해야 할 수 있기 때문입니다(탭, 따옴표 또는 형식을 깨는 기타 문자가 포함된 경우).

JSON을 생성할 수 있는 두 가지 훌륭한 도구가 있습니다. 가장 간단한 사용법은 다음과 같습니다 jo.

while IFS= read -r line; do
    utility "$( jo id="$( jo S="$line" )" )"
done <input.txt

다른 하나는 다음과 jq같습니다

while IFS= read -r line; do
    utility "$( jq -c --arg data "$line" -n '{ id: { S: $data } }' )"
done <input.txt

두 루프 모두 읽은 데이터(JSON 인코딩일 수 있음)로 중첩된 JSON 객체를 올바르게 생성하고 utility해당 객체를 매개변수로 사용하여 유틸리티를 호출합니다.

를 사용하면 jq루프를 뒤집어서 반복 jq할 때마다 호출하는 것을 방지할 수도 있습니다. 이를 수행하려면 출력 결과 집합의 각 요소가 행("간소한 출력")이 되도록 -c하는 using이 필요합니다 .jq

jq -c -R '{ id: { S: . } }' input.txt |
while IFS= read -r json; do
    utility "$json"
done

...또는 명령을 생성하도록 하세요 eval.

eval "$(
   jq -r -R '[ "utility", ({ id: { S: . } } | @json) ] | @sh' input.txt
)"

output.txt질문에서 읽은 파일을 호출하고 있으므로 이를 생성하는 일부 워크플로우 단계가 있을 수 있습니다. utility수행 중인 작업에 따라 이전 호출을 파이프라인에 통합하거나 완전히 우회 할 수 있습니다 . 특히 ID가 일부 JSON 문서에서 나오는 경우.

답변2

문자열을 작은따옴표가 아닌 큰따옴표로 묶으십시오. 큰따옴표 안의 백슬래시를 잊지 마세요.

while read line; do
    command "{'\"id\"':{\"S\":\"$line\"}}"
done <output.txt

답변3

동일한 쉘 문자열 내에서 따옴표를 혼합할 수 있으므로 문자열의 한 부분은 작은 따옴표를 사용하여 작성하기 쉽고 다른 부분은 대체가 필요한 경우 리터럴 부분에는 작은 따옴표를 사용하고 대체 부분에는 큰 따옴표를 사용할 수 있습니다.

$line그러나 결과 JSON에 큰따옴표, 백슬래시 또는 제어 문자가 포함되어 있으면 형식이 잘못됩니다.

또한 일반은 read line백슬래시 해석을 수행하고 공백을 제거합니다. 바라보다"IFS=read-r-line" 이해

while IFS= read -r line; do
  case $line in
    *[\\\"]*) echo >&2 "I'm not smart enough to handle special characters. Giving up."; exit 1;;
  esac
  command '{"id":{"S":"'"$line"'"}}'
done

관련 정보