예를 들어, 서브쉘 출력을 캡슐화하기 위해 따옴표를 사용해야 한다고 가정해 보겠습니다.
DATA="$(cat file.hex | xxd -r)"
하지만 다음과 같이 중첩해야 합니다.
DATA="$(cat file.hex | xxd -r | tr -d \"$(cat trim.txt)\")"
작은따옴표는 내부 변수를 확장하지 않으므로 사용할 수 없습니다. 이스케이프된 따옴표는 수동 텍스트로 처리되기 때문에 작동하지 않습니다.
이 문제를 어떻게 처리해야 합니까?
답변1
서브쉘 내부의 따옴표를 이스케이프 처리할 필요는 없습니다.현재 쉘설명하지 않습니다(사실 $(
에서 ~까지 아무것도 설명하지 않습니다 )
).서브쉘위의 참조 내용을 전혀 알지 못합니다.
변수에 값을 할당할 때 서브쉘을 인용하는 것도 불필요합니다 man bash
. 자세한 내용은 을 참조하세요.
답변2
내부 중첩 따옴표를 이스케이프 처리할 필요는 없습니다. 놀랍게도 올바르게 구문 분석되었습니다!
DATA="$(cat file.hex | xxd -r | tr -d "$(cat trim.txt)")"
답변3
방금 $()
서브쉘의 stdout을 참조로 처리하여 성공했으므로 변수 확장 시 내부 따옴표를 사용했습니다.
# Part of an MSys2 reimplementation of realpath, hence the `-W`
input="../../My Programs"
output=$(cd "$input"; pwd -W)
echo "$output"
공백은 My Programs
그대로 유지되며 악의적인 따옴표는 표시되지 않습니다.output