POSIX シェル: 二重引用符内で、 `\` は `$`、```、````、`\`、または ` をエスケープできません。`?

POSIX シェル: 二重引用符内で、 `\` は `$`、```、````、`\`、または ` をエスケープできません。`?

~によるとPOSIX シェルコマンド言語ページ:

\

<backslash>エスケープ文字としての特別な意味は、次のいずれかの文字が続く場合にのみ保持する必要があります(エスケープ文字(バックスラッシュ)を参照)。特別だと思うとき:

$ ` " \ <newline>

これは、バックスラッシュを使用してこの5文字を​​エスケープすると、その文字をエスケープする効果がなく、「特別」でなければ文字通り処理しないことを意味するようです。

これを正しく解釈していますか?それでは\、この5つの特殊文字のうちの1つをaでエスケープ処理すると、意図したエスケープ効果が発生しない場合がありますか?

答え1

@MichaelHomerがこれについて説明します。とても良いです。実際のケースを試してみましょうPS1='\$ '

$ echo "$ at start"
$ at start
$ echo "at end $"
at end $
$ echo "$before"

$ echo "after$"
after$

したがって、$単語の前に「special」を付けるだけです。パラメータの置換。これらすべての項目の前にバックスラッシュを追加するとどうなりますか?

$ echo "\$ at start"
$ at start
$ echo "at end \$"
at end $
$ echo "\$before"
$before
$ echo "after\$"
after$

「特殊」行だけが変更されました。今ドル記号は文字通り扱われます。それいつも文字通り受け入れました。他のキャラクターはどうなりますか?

$ echo "\ at start"
\ at start
$ echo "at end \"
> ^C
$ echo "\before"
\before
$ echo "after\"
> ^C

したがって、バックスラッシュは特殊文字ではなく、文字の前にある別のリテラル文字です。 (^ Cは、引用符がエスケープされているため、コマンドラインをキャンセルする必要がある場所です。)

答え2

たとえば、文字は$特別な意味を持ち、文字通りデータの一部になる以上の影響を与える場合に特別と見なされます。では、$xパラメータ$拡張が特別な意味で導入されました。

このフレーズが意味するのは、バックスラッシュがエスケープ文字というユニークな意味を持つということです。ただ特別な意味を持つこれらの文字の一つの前に来るとき。一般的に、バックスラッシュはより広いエスケープの意味を持ちます。:

引用符のない<backslash>は、<newline>を除く後続の文字のリテラル値を保持します。

たとえば、"\$x"文字列 "$x"の代わりに"a\ b"。 2番目のケースのバックスラッシュがリストにない文字の前に来て、したがって特別な意味がないからです。ただし、二重引用符の外側にはa\ b文字列 "ab"があり、バックスラッシュのためにスペースが文字通り含まれ、バックスラッシュ自体が削除されます。

あなたが引用した詩たまにそんなキャラクターじゃないけど維持する特別な意味を超えたにもかかわらずしかし、バックスラッシュはそのうちの1つに影響を与えない限り、特別な意味はありません。


ここに潜在的なぶら下げ修飾子があります:はい数値特別だと思われるかバックスラッシュ

二重引用符内の特定の文字に特別な意味がない可能性がある可能性があります。あなたが引用したポイントの直前のポイントしかし、またここでは文書区切り記号として。ただし、組み込みの拡張機能には、この文書の区切り文字などの独自の引用規則があるため、実際に表示されるかどうかはわかりません。バックスラッシュの場合、これは二重バックスラッシュが何もエスケープしないという意味にすぎません。

私が知っている最善の点は、文字を制限すると、次の文書区切り文字を取得できることです。

cat <<"A$B"
A$B
cat <<"A\$B"
A$B

これら2つは私のすべてのシェルで同じことをします。$最初は区切り文字に含まれていたので特別ではありませんが、2番目の\内部二重引用符はエスケープしないでください。文字通り含める必要があります。私はこれが必要な行動であるかどうかはわからないと思いますが、これは法の規定内にあるようです。

埋め込み拡張の場合、$(...)引用符の効果(両方の種類)を拒否したり、独自の引用規則があり、何か(さまざまなおよび${...}` ... `を引用する独自の方法はなく、まだ明示的な項目を構成していません。 - 特殊なバックスラッシュが先に来るこれらの文字の1つの特殊バージョンです。

太字が現在重複しているようです。潜在的なぶら下がっている修飾子は少なくともそれをあいまいにします。おそらく、正誤表または次の更新プログラムで送信する必要があるフレーズエラーかもしれません。

答え3

それを単純化しようとしましょう。
テキストは次のとおりです。

<バックスラッシュ>は、次のいずれかの文字が続く場合に特殊文字として扱われる場合にのみ、エスケープ文字としての特別な意味を維持する必要があります(エスケープ文字(バックスラッシュ)を参照)。

私たちはその一部を変換できます:

  1. <バックスラッシュ> ==>第二

  2. ...エスケープ文字という特別な意味を維持する必要があります
    ... \__________/---------\______/
    ==>それでもそうです--- ------------ ----エスケープ文字
    ==>はまだエスケープ文字です。

    現状のまま連合国- 引用符付き文字列。

  3. ... ただ

  4. ...次の文字のいずれかが後に続く場合 ==> A第二[$`"\の前にオランダ]

  5. ...特別だと思われる場合

その後、1、2、4は次のようになります。 第二それでも[$`"\以前の脱出オランダ]

  • 議論となる部分は次のとおりです。特別だと思うとき

    存在とは特別だと思われる

    >>「キャラクター」<<と思います。書かれたように:

    特殊と見なされる場合は、次の文字のいずれか:

    Q:はい:いつ"特別なのですか(二重引用符で囲む)?

    答え:常に(のような入れ子構造に関係なくecho "$(sed 's/["]//' file)")。

    したがって、バックスラッシュは常に":(echo "a\"b\"b\""再び、入れ子構造はありません)を引用します。

  • その後、1、2、3、4、および5は次のようになります。

    第二まだ脱出だよただ今後特別な[$`"\オランダ]

したがって、あなたの質問に答えるには:

「」、orを\避けられない状況がありますか?$"\<newline>

例: はい、[$`"\ 文字がある場合オランダ] 特別ではありません。

彼ら(キャラクター)はおそらく特別ではないたとえば、入れ子になった構造内にありますが、引用符内にあります。

関連情報