Bash 큰따옴표의 백슬래시 개행 문자를 이해할 수 없습니다.

Bash 큰따옴표의 백슬래시 개행 문자를 이해할 수 없습니다.

~에 따르면GNU 문서,

백슬래시는 '$', '`', '"', '\' 또는 개행 문자 중 하나가 뒤에 오는 경우에만 특별한 의미를 유지합니다. 큰따옴표 내에서 백슬래시는 이러한 문자 중 하나 뒤에 옵니다. 삭제되었습니다.

나는 노력했다

p="a\$b";echo $p  # a$b
p="a\`b";echo $p  # a`b
p="a\"b";echo $p  # a"b
p="a\\b";echo $p  # a\b

모든 것이 잘되었습니다. 그런데 새로운 라인이요?

p="a\newlineb";echo $p  # a\newlineb

문서의 개행 문자는 무엇을 의미합니까?

답변1

\nNewline은 일반적으로 C로 작성되는 문자인 개행 문자의 이름입니다 .

$ p="a\
b"; echo "$p"
ab

결과는 ab아니기 \a<newline>b때문에POSIX 표준에 따르면:

따옴표가 없는 A는 <backslash>a를 제외한 후속 문자의 리터럴 값을 유지해야 합니다 <newline>. a가 <newline>쉘 다음에 오면 <backslash>쉘은 이를 줄 연속으로 해석합니다. 입력을 토큰으로 <backslash>분할하기 전에 제거해야 합니다. <newline>이스케이프 문자는 <newline>입력에서 완전히 제거되고 공백으로 대체되지 않으므로 토큰 구분 기호로 사용할 수 없습니다.

하지만 문자열큰따옴표로 묶어야 합니다. 음, 이것은 특별한 경우입니다.

<backslash>특수 문자로 처리되고 뒤에 다음 문자 중 하나가 오는 경우에만 이스케이프 문자로서 특별한 의미를 유지해야 합니다: $, `, ", \, <newline>.

따라서 큰따옴표로 묶인 문자열은 백슬래시 줄 바꿈이 마치 다음과 같이 해석된다는 것을 의미합니다.아니요완전히 인용되었습니다. 즉, 줄 연속으로 작동하고 백슬래시와 개행 문자가 제거됩니다.

이는 변수를 할당할 때가 p아니라 변수에 할당할 때 발생합니다 echo.

당신은 또한 볼 수 있습니다bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험변수를 참조해야 한다는 점에서는 항상 그렇습니다.

관련 정보