printfコマンドを使用するときにどの文字をエスケープする必要がありますか?

printfコマンドを使用するときにどの文字をエスケープする必要がありますか?

シェル解析レベルでエスケープ文字について話すのではないことを明確にしたいと思います。

私が知る限り、エスケープすべき文字は2つだけです%\

テキストを印刷するには、%前のエスケープ文字を使用する必要があります%

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 %

これら3つをテストしましたが、期待どおりに機能しましたbashman bashこの実装によると、この実装はprintfここに関連しない一部の仕様に加えて、上記の「標準 printf(1) 形式仕様」を使用します。


ただし、他のシェルではzshこれをprintf少し異なる方法で実装しています。ここで二重引用符をエスケープしないでください。

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

関連情報