스크립트에서 따옴표를 이스케이프하는 문제

스크립트에서 따옴표를 이스케이프하는 문제

"mogrify" 도구와 함께 사용할 명령줄을 작성 중입니다. [섹션이미지 매직]. 최종 명령줄은 다음과 같습니다.

mogrify -stroke yellow -draw 'line 0,0 0,319' -draw 'line 125,0 125,319' -draw 'line 652,0 652,319' file.png

명령을 실행하기 전에 명령을 에코합니다. 이 에코 라인을 작성된 대로 새 명령으로 셸에 복사/붙여넣으면 완벽하게 작동합니다.

그러나 스크립트에서는 작동하지 않습니다. 어떤 이유로 이름 등의 mogrify파일을 찾고 있습니다 . 분명히 인수 문자열을 주위에 작은따옴표가 없는 것처럼 해석합니다 .0,00,319mogrifydraw

[즉, 오류가 발생한 스크립트의 줄]에 주어진 최종 명령은 다음과 같습니다.

mogrify -stroke $C3 $args $FILE

나는 반복적으로 문자열을 구성합니다 $args. 마지막 문자열의 결과는 제가 이 질문의 상단 근처에 놓은 것입니다.

백슬래시를 사용하여 작은 따옴표를 이스케이프 처리하고, 큰 따옴표를 사용하여 작은 따옴표를 이중 이스케이프하고, 구성 루프에서 작은 따옴표와 큰 따옴표를 교환해 보았습니다. 나는 또한 $args그것을 큰 따옴표로 묶으려고 시도했습니다. 심지어 각 매개변수를 배열에 넣은 다음 ${args[@]}최종 호출에서 [ $args위 위치]를 사용해 보았습니다. 내가 시도한 것은 아무것도 작동하지 않았습니다.

[편집 - 배열 스타일 호출에 대한 자세한 정보 표시]

배열 호출을 위해 다음과 같이 배열을 준비합니다.

data="99.8734 351.645 1836.05"
for p in $data; do
    x=$(echo "$W * $p / $duration" | bc)
    args+=(-draw "'line $x,$y1 $x,$y2'")
done

[참고: $data는 실제로 외부 소스에서 검색되지만 이 질문의 목적을 위해 여기에 문자 그대로 데이터 포인트를 할당합니다. ]

배열 호출을 사용하여 mogrify를 호출할 때 스크립트에서 다음 명령을 실행합니다. mogrify -stroke $C3 "${args[@]}" $FILE

이 경우 공백도 없고 $C3공백 $FILE도 없습니다.

위에서 얻은 오류는 다음과 같습니다. mogrify: non-conforming drawing primitive definition 'line 35,0 35,320' @ error/draw.c/RenderMVGContent/4271

이제 배열 할당이 제대로 작동하는 것처럼 보이지만 쉘이 로드 중입니다 mogrify.

정확한 명령줄을 에코하면 다음이 표시됩니다. mogrify -stroke yellow -draw 'line 35,0 35,319' -draw 'line 125,0 125,319' -draw 'line 652,0 652,319' file.png

흥미롭게도 배열 할당을 다음과 같이 변경하면 큰따옴표가 줄 정의뿐만 아니라 전체 항목으로 이동되었습니다. args+=("-draw 'line $x,$y1 $x,$y2'")

...그런 다음 mogrify에서 다음과 같은 오류가 발생했습니다. mogrify: unrecognized option '-draw 'line 35,0 35,319'' @ error/mogrify.c/MogrifyImageCommand/4716

이제 오류 출력에는 이전에는 포함되지 않았던 줄 정의 주위에 배치한 작은따옴표가 올바르게 포함됩니다. 이로 인해 작은따옴표도 이스케이프 처리하려고 생각하게 되었지만 '\''그것도 작동하지 않았습니다. 작은 따옴표와 큰 따옴표를 뒤집는 것도 [전체 내부에서 변수 확장을 허용]하지 않습니다.

답변1

큰따옴표(또는 작은따옴표)는 쉘이 그 안의 텍스트를 처리하는 것을 중지하는 데 사용됩니다. 명령 자체의 일부로 추가할 수는 없습니다.

하지만 할 수 있는 일은 배열 빌드 명령을 사용한 다음 해당 배열 변수를 결과에 포함시키는 것입니다. 여기서는 args스칼라(문자열) 대신 배열 변수를 사용하여 목록에 인용된 값을 반복적으로 추가할 수 있습니다.

C3=yellow
FILE=file.png

args=()
args+=(-draw 'line 0,0 0,319')
args+=(-draw 'line 125,0 125,319')
args+=(-draw 'line 652,0 652,319')

또는

args+=(-draw "line $x,$y1 $x,$y2")

리터럴 숫자 대신 변수를 사용하는 경우. 특히 업데이트된 질문에 표시된 작은따옴표가 올바르지 않다는 점에 유의하세요 args+=(-draw "'line $x,$y1 $x,$y2'").가치) 로 전달됩니다 mogrify.

args마지막으로, 쉘이 각 요소를 따옴표로 묶은 값으로 처리하도록 값 세트를 큰따옴표로 묶습니다 .

mogrify -stroke "$C3" "${args[@]}" "$FILE"

관련 정보