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を使えば、クォートを入れ子にしなくてもいいって?あくまで例ですから (`・ω・´)キリッ