$ printf "hi"
hi$ printf "hi\n"
hi
$ printf "hi\\n"
hi
마지막 줄이 인쇄되지 않는 이유는 무엇입니까 hi\n
?
답변1
관련은 없지만 printf
모든 것과 관련이 있습니다.당신이 하는 주장printf
.
큰따옴표로 묶인 문자열에서 쉘은 \\
가 됩니다 \
. 따라서 사용자가 제공하는 인수는 물론 printf
실행 됩니다 .hi\n
printf
그것은이스케이프 시퀀스 처리가 켜져 있습니다.
큰따옴표로 묶인 문자열에서 \
쉘에 의한 이스케이프는 특히 ␊, , 및 문자에만 영향을 미치 \
도록 `
제한 $
됩니다 "
. 당신은 그것이 그대로 전달된다는 것을 알게 될 것입니다 \n
. printf
그래서 당신이 하고 있는 주장은 printf
실제로hi\n
다시.
형식 문자열에 이스케이프 시퀀스를 넣을 때는 주의하십시오 printf
. 일부만에 정의된 의미단일 유닉스 사양. 예를 들어 \n
정의되었지만 실제로는 정의되지 않았습니다.\c
추가 읽기
답변2
큰 따옴표 안에는 \\n
이스케이프된(인용) 백슬래시가 있고 그 뒤에 가 있습니다 n
. 이것은 개행 문자를 출력 합니다 printf
.\n
printf
큰따옴표 안은 \n
(여전히) string 입니다 \n
. 다시 문자열 printf
을 받고 \n
개행 문자를 인쇄합니다.
큰따옴표 내에서는 백슬래시가 특별합니다.오직다른 백슬래시, 개행 문자 또는 기타 항목이 $
앞에 `
오는 경우 또는 "
. "Special"은 다음 문자의 특별한 의미를 제거한다는 의미입니다. 백슬래시가 다른 문자 앞에 오면( n
예를 들어) 백슬래시 문자일 뿐입니다.
이에 대한 설명은 다음과 같습니다.POSIX 표준.
형식 문자열 \n
로 인쇄 하려면 또는 를 사용 하거나printf
printf '\\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