![이스케이프 없이 문자열 교체에 앰퍼샌드(&)를 사용할 수 없는 이유는 무엇입니까?](https://linux55.com/image/216201/%EC%9D%B4%EC%8A%A4%EC%BC%80%EC%9D%B4%ED%94%84%20%EC%97%86%EC%9D%B4%20%EB%AC%B8%EC%9E%90%EC%97%B4%20%EA%B5%90%EC%B2%B4%EC%97%90%20%EC%95%B0%ED%8D%BC%EC%83%8C%EB%93%9C(%26amp%3B)%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EC%88%98%20%EC%97%86%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
아래 스크립트는 매우 간단합니다 . &
다음으로 바꾸세요 &
.
string="Foo & Bar"
echo "${string//&/&}";
그러나 스크립트는 아무것도 하지 않습니다. 오류 메시지가 없으며 아무것도 대체되지 않습니다.
Foo & Bar
마침내 해결책을 찾았습니다. 교체 부품에서 앰퍼샌드를 이스케이프 처리해야 합니다.
string="Foo & Bar"
echo "${string//&/\&}";
내가 아직 파악하지 못한 것은왜? 스크립트가 예상대로 작동하지 않는 이유는 무엇입니까? 왜 첫 번째 기호(예: ${string//\&/\&}
) 가 아닌 마지막 & 기호만 이스케이프해야 합니까 ?
이것은 & 기호가 특별한 의미를 갖거나 문자열 교체에 사용된다는 것을 의미합니까?
답변1
여기,&
일치하는 패턴을 나타냅니다.:
patsub_replacement
쉘 활성화 옵션을 사용하는 경우shopt
인용되지 않은&
'' 인스턴스는끈일치하는 부품으로 교체됩니다.무늬. 이는 일반적인sed
관용구를 반복하기 위한 것입니다.
확장 프로그램이 이스케이프되지 않으면 결국 &
"" 자체로 대체됩니다.
이 기능은배쉬 5.2에 추가됨.