~에 따르면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
\n
Newline은 일반적으로 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 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험변수를 참조해야 한다는 점에서는 항상 그렇습니다.