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

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

次のようなBash があるとしますalias:

alias rxvt='urxvt'

それはうまく動作します。

しかし:

alias rxvt='urxvt -fg '#111111' -bg '#111111''

動作しません。以下も同様です。

alias rxvt='urxvt -fg \'#111111\' -bg \'#111111\''

では、引用符をエスケープした後、文字列内の開始引用符と終了引用符をどのように一致させるのでしょうか?

alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''

このように連結できる場合は同じ文字列を表すことになりますが、見た目は不格好です。

ベストアンサー1

最外層で本当に一重引用符を使用したい場合は、両方の種類の引用符を結合できることを覚えておいてください。例:

 alias rxvt='urxvt -fg '"'"'#111111'"'"' -bg '"'"'#111111'"'"
 #                     ^^^^^       ^^^^^     ^^^^^       ^^^^
 #                     12345       12345     12345       1234

'"'"'どのように解釈されるかについての説明は、次のとおりです'

  1. '一重引用符を使用した最初の引用符を終了します。
  2. "二重引用符を使用して 2 番目の引用符を開始します。
  3. '引用文字。
  4. "二重引用符を使用して 2 番目の引用符を終了します。
  5. '3 番目の引用符は一重引用符を使用して開始します。

(1)と(2)の間、または(4)と(5)の間に空白を入れないと、シェルはその文字列を1つの長い単語として解釈します。

$ echo 'abc''123'  
abc123
$ echo 'abc'\''123'
abc'123
$ echo 'abc'"'"'123'
abc'123

また、結合する文字列を含む内部表現も保持され、可能な場合はより短いエスケープ構文が優先されます。

$ alias test='echo '"'"'hi'"'"
$ alias test
alias test='echo '\''hi'\'''
$ test
hi

おすすめ記事