추가 읽기

추가 읽기
$ printf "hi"
hi$ printf "hi\n"
hi
$ printf "hi\\n"
hi

마지막 줄이 인쇄되지 않는 이유는 무엇입니까 hi\n?

답변1

관련은 없지만 printf모든 것과 관련이 있습니다.당신이 하는 주장printf.

큰따옴표로 묶인 문자열에서 쉘은 \\가 됩니다 \. 따라서 사용자가 제공하는 인수는 물론 printf실행 됩니다 .hi\nprintf그것은이스케이프 시퀀스 처리가 켜져 있습니다.

큰따옴표로 묶인 문자열에서 \쉘에 의한 이스케이프는 특히 ␊, , 및 문자에만 영향을 미치 \도록 `제한 $됩니다 ". 당신은 그것이 그대로 전달된다는 것을 알게 될 것입니다 \n. printf그래서 당신이 하고 있는 주장은 printf실제로hi\n 다시.

형식 문자열에 이스케이프 시퀀스를 넣을 때는 주의하십시오 printf. 일부만에 정의된 의미단일 유닉스 사양. 예를 들어 \n정의되었지만 실제로는 정의되지 않았습니다.\c

추가 읽기

답변2

큰 따옴표 안에는 \\n이스케이프된(인용) 백슬래시가 있고 그 뒤에 가 있습니다 n. 이것은 개행 문자를 출력 합니다 printf.\nprintf

큰따옴표 안은 \n(여전히) string 입니다 \n. 다시 문자열 printf을 받고 \n개행 문자를 인쇄합니다.

큰따옴표 내에서는 백슬래시가 특별합니다.오직다른 백슬래시, 개행 문자 또는 기타 항목이 $앞에 `오는 경우 또는 ". "Special"은 다음 문자의 특별한 의미를 제거한다는 의미입니다. 백슬래시가 다른 문자 앞에 오면( n예를 들어) 백슬래시 문자일 뿐입니다.

이에 대한 설명은 다음과 같습니다.POSIX 표준.

형식 문자열 \n로 인쇄 하려면 또는 를 사용 하거나printfprintf '\\n'printf "\\\\n"printf '%s' '\n'

일반적으로 printf형식 문자열은 작은따옴표로 묶어야 하며 모든 변수 데이터는 형식 문자열에 삽입할 추가 인수로 제공되어야 합니다.

printf 'This is how you write a newline: %s\n' '\n'

답변3

자, 또 다른 관점을 추가해 보겠습니다.

여기에는 두 가지 수준의 해석이 있습니다. 하나는 쉘이고 다른 하나는 printf수신된 인수에 대한 명령의 해석(이 경우)입니다.

큰따옴표 안에쉘은 대부분의 백슬래시 문자 시퀀스를 보존하며 이는 일반적인 결과입니다.

$ printf '%s\n'    "\a \b \c \d ... \z     \$ \` \\ "
\a \b \c \d ... \z     $ ` \

와는 별개로그 중 $, `, 및 는 \쉘에만 해당되므로 \삭제하시기 바랍니다.

따라서 사용한 문자열(및 기타 문자열)을 테스트하면 다음과 같은 결과를 얻을 수 있습니다.

$ printf '%s\n'     "hi\n"     "hi\\n"    "hi\\\n"    "hi\\\\n"    "hi\\\\\n"
hi\n
hi\n
hi\\n
hi\\n
hi\\\n

쉘은 쌍을 \\하나로 변환합니다 \. 그리고 혼자 \n남겨졌다 \n.

이제 printf첫 번째 매개변수와 특별한 관계가 있으며 명시적으로 로 설정됩니다 the format. 형식 매개변수에서 일부 문자는 특수 문자입니다(printf의 경우). 예: 다음으로 시작하는 유효한 %시퀀스그리고일부백슬래시 문자 시퀀스좋다:

\\  \a  \b  \f  \n  \r  \t  \v  and the special \ddd

따라서 문자열은 \n개행을 생성하지만 \\n개행은 생성하지 않습니다.

$ printf "    hi\n    hi\\n    hi\\\n   hi\\\\n"; echo
hi
hi
hi\n   hi\n

관련 정보