web-dev-qa-db-ja.com

bashで一重引用符で囲まれた文字列でアポストロフィをどのようにエスケープしますか?

Bashが単一引用符で囲まれた文字列内のアポストロフィ文字のエスケープをどのように評価するのか理解できません。

次に例を示します。

$ echo ''\''Hello World'\'''
'Hello World' # works

$ echo '\'Hello World\''
 > # expects you to continue input

これについての説明を探してみましたが、何も得られませんでした。ここでbashは何をしていますか?

20
Kibet

一重引用符では、エスケープはできません。単一引用符を単一引用符に含める方法はありません。 man bashQuotingを参照してください。

21
choroba

POSIXでサポートされている一重引用符と二重引用符に加えて、bashは、引用符付き文字列でエスケープ文字の小さなクラス(一重引用符を含む)を許可する追加タイプの引用符を提供します。

$ echo $'\'Hello World\''
'Hello World'

セクションの終わり近くにあるbash manページのQUOTINGセクションを参照してください。 (「ANSI C」を検索してください。)

11
chepner

シェルで引用符をエスケープする簡単な例:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

既に開いているものを閉じることで行われます(')、エスケープされたもの(\')印刷してから別のファイルを開きます(')。

または:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

既に開いているものを終了することで行われます(')、引用符を別の引用符で囲む("'")、次に別のものを開きます(')。

あなたがしたこと ('\'Hello World\'')、は:

  1. 最初のアポストロフィを開いた:'
  2. 閉店\'なので、文字列は'\'
  3. Hello Worldは引用符ではありません。
  4. スタンドアロンのアポストロフィ(\')開かずに。
  5. 最後のアポストロフィ(')は開始ストリングですが、予期される終了ストリングはありません。

したがって、正しい例は次のようになります。

$ echo \'Hello World\'
'Hello World'

関連: 単一引用符で囲まれた文字列内の単一引用符をエスケープする方法?

4
kenorb

エスケープされたアポストロフィで何が起こっているかを説明するために、2番目の例を調べます( 一重引用符 または 強い引用符 も参照):

$ echo '\'Hello World\''
>     # expects you to continue input

ここで、あなたが述べたように、あなたは引用をぶら下げたままにしました。次に、最後をトリミングして、次のように変更します。

                     v                                v           v
$ echo '\'Hello World     # Echo two strings: '\' and 'Hello World'.
\Hello World         ^

「Hello World」サブストリングはここでは引用されていませんが、強い引用符で囲まれているかのように動作しました。もう一度例を使用して、今回は最後を別の方法でトリミングします。

                     vv                                    v (plain apostrophe)
$ echo '\'Hello World\'   # Will echo: '\' and 'Hello World''
\Hello World'        ^^   # Note that the trailing ' char is backslash escaped. 

"Hello World"サブストリングは再び、強い引用符で囲まれているかのように動作し、最後に追加されたアポストロフィ(エスケープされたため、もはや単一引用符ではありません)のみが含まれます。

別の単一引用符が最後に追加されると(元の例)、文字列はぶら下がったまま残り、終了引用符を待機します。

3
zero2cx