1. ホーム
  2. bash

[解決済み] 一重引用符で囲まれた文字列の一重引用符をエスケープするには

2022-03-18 05:56:29

質問

例えば、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'\''

は、このように連結してよいのであれば、同じ文字列を表すことになるのですが、気が引けます。

解決方法は?

どうしても一重引用符を最外層に使いたい場合は、両方の種類の引用符を糊付けできることを覚えておいてください。例を挙げます。

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

の説明 '"'"' は、単に ' :

  1. ' シングルクォートを使用した最初の引用を終了する。
  2. " 二重引用符を使用して、二番目の引用を開始する。
  3. ' 引用された文字。
  4. " 二重引用符を使用して、二番目の引用を終了する。
  5. ' 一重引用符で囲んで、3つ目の引用を開始する。

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