~에 따르면그누 문서,
백슬래시는 '$', '`', '"', '\' 또는 줄바꿈 문자 중 하나가 뒤에 오는 경우에만 특별한 의미를 유지합니다. 큰따옴표 내에서 이러한 문자 중 하나가 뒤에 오는 백슬래시는 제거됩니다. .
나는 노력했다
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
Newline은 개행 문자의 이름입니다. 즉, 일반적으로 \n
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 쉘에서 변수를 인용하는 것을 잊어버린 경우의 보안 영향항상 변수를 인용해야 하는 필요성에 대해 설명합니다.