이스케이프 없이 문자열 교체에 앰퍼샌드(&)를 사용할 수 없는 이유는 무엇입니까?

이스케이프 없이 문자열 교체에 앰퍼샌드(&)를 사용할 수 없는 이유는 무엇입니까?

아래 스크립트는 매우 간단합니다 . &다음으로 바꾸세요 &.

string="Foo & Bar"
echo "${string//&/&}";

그러나 스크립트는 아무것도 하지 않습니다. 오류 메시지가 없으며 아무것도 대체되지 않습니다.

Foo & Bar

마침내 해결책을 찾았습니다. 교체 부품에서 앰퍼샌드를 이스케이프 처리해야 합니다.

string="Foo & Bar"
echo "${string//&/\&}";

내가 아직 파악하지 못한 것은? 스크립트가 예상대로 작동하지 않는 이유는 무엇입니까? 왜 첫 번째 기호(예: ${string//\&/\&}) 가 아닌 마지막 & 기호만 이스케이프해야 합니까 ?

이것은 & 기호가 특별한 의미를 갖거나 문자열 교체에 사용된다는 것을 의미합니까?

답변1

여기,&일치하는 패턴을 나타냅니다.:

patsub_replacement쉘 활성화 옵션을 사용하는 경우 shopt인용되지 않은 &'' 인스턴스는일치하는 부품으로 교체됩니다.무늬. 이는 일반적인 sed관용구를 반복하기 위한 것입니다.

확장 프로그램이 이스케이프되지 않으면 결국 &"" 자체로 대체됩니다.

이 기능은배쉬 5.2에 추가됨.

관련 정보