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


18

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

以下に例を示します。

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

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

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


echo \''Hello World'\'
数学

回答:


19

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


1
あなたが正しい。秘Theは、「バックスラッシュが先行する場合でも、単一引用符の間で単一引用符が発生しない可能性がある」という行にあるため、おそらくそれを異なる部分に分割します。
キベット

@Colin単一引用符が他の2つの単一引用符の内側にある(ただし、バックスラッシュが付いている)とすぐに、引用符で囲まれた引用符は実際の引用符ではなくなります。特別なペアリング特性を持たない単なる文字です。
zero2cx

1
@ zero2cx:真実ではない:echo '\''
choroba 14年

@ zero2cx:「inside」ではなく「outside」と言います。
チョロバ

3
@choroba「完全に」、本当のあなたが行うことができますbashのではないecho $'\'hello world\''
BUFH

9

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

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

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


3

エスケープされたアポストロフィで何が起こっているかを説明するために、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

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

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

既に開いているもの(')を閉じ、エスケープしたもの(\')を配置して印刷し、もう1つ(')を開きます。

代わりに:

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

既に開いているもの(')を終了し、別の引用符("'")に引用符を配置してから、別の引用符()を開き'ます。

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

  1. 最初のアポストロフィを開きました:'
  2. その直後に閉じ\'られるため、文字列は次のようになります'\'
  3. Hello World 引用符ではありません。
  4. スタンドアロンアポストロフィ(\')を開かずに配置しました。
  5. 最後のアポストロフィ(')は開始文字列ですが、予想される終了文字はありません。

したがって、正しい例は次のとおりです。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.