Bashが単一引用符で囲まれた文字列内のアポストロフィ文字のエスケープをどのように評価するのか理解できません。
次に例を示します。
$ echo ''\''Hello World'\'''
'Hello World' # works
$ echo '\'Hello World\''
> # expects you to continue input
これについての説明を探してみましたが、何も得られませんでした。ここでbashは何をしていますか?
一重引用符では、エスケープはできません。単一引用符を単一引用符に含める方法はありません。 man bash のQuotingを参照してください。
POSIXでサポートされている一重引用符と二重引用符に加えて、bash
は、引用符付き文字列でエスケープ文字の小さなクラス(一重引用符を含む)を許可する追加タイプの引用符を提供します。
$ echo $'\'Hello World\''
'Hello World'
セクションの終わり近くにあるbash
manページのQUOTINGセクションを参照してください。 (「ANSI C」を検索してください。)
シェルで引用符をエスケープする簡単な例:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
既に開いているものを閉じることで行われます('
)、エスケープされたもの(\'
)印刷してから別のファイルを開きます('
)。
または:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
既に開いているものを終了することで行われます('
)、引用符を別の引用符で囲む("'"
)、次に別のものを開きます('
)。
あなたがしたこと ('\'Hello World\''
)、は:
'
。\'
なので、文字列は'\'
。Hello World
は引用符ではありません。\'
)開かずに。'
)は開始ストリングですが、予期される終了ストリングはありません。したがって、正しい例は次のようになります。
$ echo \'Hello World\'
'Hello World'
エスケープされたアポストロフィで何が起こっているかを説明するために、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"サブストリングは再び、強い引用符で囲まれているかのように動作し、最後に追加されたアポストロフィ(エスケープされたため、もはや単一引用符ではありません)のみが含まれます。
別の単一引用符が最後に追加されると(元の例)、文字列はぶら下がったまま残り、終了引用符を待機します。