문자열 내부에 삽입 될 수있는 중첩 구조는 내부에 추가 문자열을 가질 수 있습니다. 새 스크립트처럼 파싱 마커까지 구문 분석되며 여러 수준으로 중첩 될 수도 있습니다. 그중 하나는 모두로 시작합니다 $
. 이들 모두는 Bash 매뉴얼과 POSIX 쉘 명령 언어 사양의 조합으로 문서화되어 있습니다.
이러한 구조에는 몇 가지 경우가 있습니다.
$( ... )
찾은으로 명령 대체 . POSIX는이 동작을 지정합니다 .
$(command)
형식을 사용하면 여는 괄호 다음에 일치하는 닫는 괄호 뒤에있는 모든 문자가 명령을 구성합니다. 유효한 쉘 스크립트는 명령에 사용할 수 있습니다 ...
따옴표는 유효한 쉘 스크립트의 일부이므로 일반적인 의미로 허용됩니다.
- 을 사용한 명령 대체
`
도.
의 "단어"요소 와 같은 고급 매개 변수 치환 인스턴스${parameter:-word}
. "word" 의 정의는 다음과 같습니다.
쉘에서 단위로 취급되는 일련의 문자
-인용 된 텍스트와 따옴표가 혼합되어 있습니다 a"b"c'd'e
-확장의 실제 동작은 그보다 약간 자유 롭고 예를 들어 ${x:-hello world}
작동합니다.
산술 확장 과 함께 $(( ... ))
, 그것은 거의 쓸모가 있지만 거기에 (하지만 당신은 둥지 명령 치환이나 변수 확장이 너무하고 그 내부에 유용하게 따옴표를 할 수 있습니다). POSIX는 다음과 같이 말합니다 .
표현은 큰 따옴표가 특수하게 처리되지 않는 것을 제외하고는 큰 따옴표로 표현 된 것처럼 취급됩니다. 쉘은 매개 변수 확장, 명령 대체 및 따옴표 제거를위한 표현식에서 모든 토큰을 확장해야합니다.
따라서이 동작은 명시 적으로 필요합니다. 그것은 글 echo "abc $((4 "*" 5))"
로빙이 아니라 산술을 의미 합니다.
그 이전 스타일하지만 참고 $[ ... ]
산술 확장되어 있지 같은 방식으로 처리 : 나타나는 경우 따옴표에 관계없이 확장이 인용되는 경우의 여부, 오류가 될 것입니다. 이 양식은 더 이상 문서화되지 않으며 어쨌든 사용되지 않습니다.
- 로 로케일 별 번역.
$"..."
실제로 "
핵심 요소로 사용합니다 . $"
단일 단위로 취급됩니다.
괄호 확장 과 함께 따옴표를 포함하지 않고 예상치 못한 중첩 사례가 하나 더 있습니다 . {a,b{c,d},e}
"a bbc e"로 확장됩니다. 그러나 중첩 ${x:-a{b,c}d}
되지 않습니다 . " a{b,c
"다음에 " d}
"를 제공하는 매개 변수 대체로 처리됩니다 . 그것은 또한 문서화되어 있습니다 :
중괄호를 사용하는 경우 일치하는 끝 중괄호는 백 슬래시 또는 따옴표로 묶인 문자열 내에서 이스케이프되지 않고 내장 된 산술 확장, 명령 대체 또는 매개 변수 확장 내에서 첫 번째 '}'입니다.
일반적으로 모든 구분 된 구문은 주변 컨텍스트와 독립적으로 본문을 구문 분석합니다 ( 예외는 버그로 처리됨 ). 본질적으로 $(
명령 대체 코드를 보면 파서가 새로운 프로그램 인 것처럼 본문에서 가능한 것을 소비하도록 요청한 다음 하위 파서가 실행되면 예상 종료 마커 (이스케이프되지 않은 )
또는 ))
또는 }
)가 나타나는지 확인합니다. 소비 할 수있는 것 중에서
재귀 하강 파서 의 기능에 대해 생각 하면 기본 사례에 대한 간단한 재귀입니다. 문자열 보간법을 얻은 후에는 실제로 다른 방법보다 쉽습니다. 기본 구문 분석 기술에 관계없이 이러한 구성을 지원하는 쉘은 동일한 결과를 제공합니다.
이러한 구성을 통해 원하는만큼 따옴표를 중첩시킬 수 있으며 예상대로 작동합니다. 중간에 따옴표를 보면 혼동되지 않습니다. 대신, 그것은 내부 맥락에서 인용 된 새로운 문자열의 시작이 될 것입니다.