~によるとPOSIX シェルコマンド言語ページ:
\
<backslash>
エスケープ文字としての特別な意味は、次のいずれかの文字が続く場合にのみ保持する必要があります(エスケープ文字(バックスラッシュ)を参照)。特別だと思うとき:
$
`
"
\
<newline>
私はこれを5つの特殊文字のうちの1つだけエスケープする必要があるという意味で解釈します\
(与えられたコンテキストで特殊文字の場合)。
ash、dash、bash、kshのマニュアルページには、「特別と見なされる場合」の節は含まれていません。これは、\
5つの文字のうちの1つが特定の文脈で特別でない場合でも、この5つの文字を無条件にエスケープする効果があるという意味(そして基本的な実験によって確認された)だと思います。
考慮された出力$ printf '%s\n' "\abcde"
、\abcde
つまりこれはa
この場合(またはその問題に対するすべての場合)、特別ではないために期待されるものであるため、\
特別ではなく文字通り処理されます。
ここで出力を考えてみ$ printf '%s\n' "\\abcde"
ましょう\abcde
。これは私が期待する動作ではありません。私の例では、文字列の最初のバックスラッシュ\\abcde
も文字通り処理する必要があるようです。それに続く\
文脈上\
特別ではないからです。私が望む出力は\\abcde
。
予期しない動作が表示される別のシナリオは、出力です$ printf '%s\n' "ab\$"
。つまり、ab$
私の考えでは$
、この場合、パラメータ拡張、コマンド置換、または算術拡張の導入に役立つので、特別な意味があります。したがって、私の考えには、それが続く文脈が特別ではない\
ので、文字通り受け入れなければならないと思う。私が望む出力は。$
$
ab\$
記録のために、私はここで完全に外れたことを願っています。これにより、特定の状況でのみこの5文字を脱出できるかどうか心配する必要がありました。私はできるだけ正確にしようとしていますが、主流のPOSIX\
互換シェルでは、この(個人的に望む)動作がPOSIXと互換性がない場合は、この5つの特殊文字のエスケープ処理に無条件に依存したくありません。
答え1
このメモテキスト削除の提案特別だと思うとき。
注:提案された修正セットは0000998に提供されています。。
また、このメモには、変更が2012年8月30日に承認されたことが報告されています。
なぜまだそんなのか分からない現在の表現に使用。
この文章は忘れてもいいと思います。
答え2
echo "\abc\$\\"
(例えば)には2つのステップが含まれる。
まず、文字列パラメータがecho
二重引用符で囲まれているため、シェルはその中のエスケープ文字を処理します。
この場合に渡す前"\abc\$\\"
にに変換されます。 「特殊」文字ではないため、遺言状は変更されません。他のエスケープ文字は次のとおりです。\abc$\
echo
\a
a
言葉これは、もはやシェルに特別な意味がないことを意味します($
拡張は開始されず、バックスラッシュは次の文字をエスケープしません)。$
二重引用符で囲まれた文字列の末尾にあるanはまだ「特別」です。そのためできる拡張が導入されましたが、文字列は直後に終わりません。最初の文字列の文字列はいかなる目的にも使用してはならないため、2つの文字列と"a$"
は"a\$"
同じです。$
その後、対応echo
する文字列パラメータを直接解釈できます。たとえば、 の一部の実装はecho
「ベル文字」を表すとみなされます。\a
私もあなたがここの基準を誤って読んでいると思います。バックスラッシュの後に特殊文字の1つが続くことが評価されます。削除するバックスラッシュ。あなたはそれが同じままでなければならず、\$
そのまま維持されるべきだと思うようです\$
。この規格は次のように規定しています。反対の。