printf 명령을 사용할 때 어떤 문자를 이스케이프해야 합니까?

printf 명령을 사용할 때 어떤 문자를 이스케이프해야 합니까?

쉘 해석 수준에서 이스케이프 문자에 대해 말하는 것이 아니라는 점을 분명히 하고 싶습니다.

내가 아는 한, 이스케이프해야 할 문자는 두 개뿐입니다 %.\

텍스트를 인쇄하려면 %앞의 이스케이프 문자를 사용해야 합니다 %.

printf '%%'

리터럴을 인쇄하려면 \앞의 이스케이프를 사용해야 합니다 \.

printf '\\'

이스케이프 문자를 문자 그대로 해석해야 하는 다른 상황이 있습니까?

답변1

형식 매개변수 중에서 및 문자 printf만 특별합니다( POSIX에 따라 특별하지 않고 지정되지 않음 ).%\"\"

그러나 두중요한노트.

  1. 대부분의 구현에서 printf및 의 바이트 값은 특별하며 POSIX 사양은 유틸리티가 예를 들어 C 함수에 대한 인터페이스가 되도록 요구하기 때문에 이를 요구하는 것으로 해석될 수도 있습니다.\%printfprintf(3)wprintf(3)%.3s3자가 아닌 3바이트로 줄여야 합니다 .).

    BIG5 및 GB18030과 같은 일부 문자 인코딩에는 백슬래시가 포함된 문자가 수백 개 있습니다.탈출하다이러한 경우에는 printf해당 문자 인코딩의 각 바이트 앞에 삽입해야 합니다 \!0x5c

    예를 들어, zh_HK.big5hkscs(홍콩) 로케일에서 사용되는 BIG5-HKSCS에서는 모든Ěαжふ㘘㙡䓀䨵䪤么佢俞偅傜兝功吒吭园坼垥塿墦声娉娖娫嫹嬞孀尐岤崤幋廄惝愧揊擺暝枯柦槙檝歿汻沔涂淚滜潿瀙瀵焮燡牾狖獦珢珮琵璞疱癧礒稞穀笋箤糭綅縷罡胐胬脪苒茻莍蓋蔌蕚螏螰許豹贕赨跚踊蹾躡鄃酀酅醆鈾鎪閱鞸餐餤駹騱髏髢髿鱋鱭黠﹏

답변2

매뉴얼에서:

$ man printf
...
   printf FORMAT [ARGUMENT]...
...
   FORMAT controls the output as in C printf.  Interpreted sequences are:

여기에는 몇 가지 설명된 시퀀스가 ​​나열되어 있습니다. 문자 자체를 이스케이프 처리해야 하는 내용은 다음과 같습니다.

   \"     double quote
   \\     backslash
   %%     a single %

이 세 가지를 테스트했는데 bash예상대로 작동했습니다. man bash이 구현 에 따르면 , 이 구현은 printf여기에 관련되지 않은 일부 사양 외에도 위에서 언급한 "표준 printf(1) 형식 사양"을 사용합니다.


그러나 다른 쉘에서는 zsh이를 printf약간 다르게 구현합니다. 여기서 큰따옴표를 이스케이프하면 안 됩니다.

$ printf '"'
"   
$ printf '\"'
\"

관련 정보