b.l0g.jp     About     Archive     Feed

bshでのクォーテーションの入れ子

特殊文字(?など)をそのまま文字として扱いたい場合などに、シングルクォーテーション(‘)やダブルクォーテーション(“)で文字をくくる。

  • 「”」でくくった文字列は、その中に特殊文字が含まれているならそれを展開する。
  • 「’」でくくった文字列は、その中に特殊文字が含まれていてもそれを展開せず、そのまま表示する。
  
[hoge@symf test]$ abc=3
    
↑ abcという変数に3を代入
  
[hoge@symf test]$ echo $abc
  
3
    
↑ abcという変数の中身を表示
  
[hoge@symf test]$ echo "$abc"
  
3
    
↑ 「"」は特殊文字を展開するので変数として扱われるので、上に同じ
  
[hoge@symf test]$ echo '$abc'
  
$abc
    
↑ 「'」は特殊文字をそのまま表示する
  

クォーテーションを入れ子にする際には、シングルとダブルで少しやり方が違う。「man bash」の「クォート」の項には以下のように書かれている。

シングルクォートで文字を囲むと、クォート内部のそれぞれの文字は文字としての値を 保持 します。シングルクォートの間にシングルクォートを置くことはできません。これはバックスラッシュを前に付けても同じです。

ダブルクォートで文字を囲むとクォート内部の全ての文字は文字としての値を保持しま すが、 $, ‘, \ は例外となります。 $ と ‘ はダブルクォートの内部でも特殊な意味を失いません。バックスラッシュの場合は、次の文字が $, ‘, “, \,のいずれかである 場合に限り特殊な意味を失いません。前にバックスラッシュを付ければ、ダブルクォート文字をダブルクォートによるクォートの内部でクォートできます。

つまりこういうこと。

  
[hoge@symf test]$ ssh server "psql -c \"create database test with ENCODING = 'UTF8' ;\" "
    
↑ 「"」の中に「\"」があるので、これは成功

[hoge@symf test]$ ssh server 'psql -c \"create database test with ENCODING = 'UTF8' ;\" '
    
↑ 「'」の中では「\」をつけてもダメなので、これは失敗
  

create databaseじゃなくてcreatedbを使えば、クォートを入れ子にしなくてもいいって?あくまで例ですから (`・ω・´)キリッ


海外の役立つブログ記事などを人力で翻訳して公開するYakstというプロジェクトをやっています。よろしければそちらもどうぞ!