シングルクォートで囲んだ中でシングルクォートを使う

シェルスクリプトの中や、コマンドプロンプトでシングルクォートで囲んだ中でシングルクォートを使うにはどうしたらいいのか?

例えば以下のようにB'zと表示しようとするとエラーになる。

> echo 'B'z'
Unmatched '.

それではバックスラッシュでエスケープすると

> echo 'B\'z'
Unmatched '.

やはりエラー。

 

エラーを回避する方法は2通り。

1.'\'をシングルクォートの前につける

> echo 'B'\''z'
B'z

2.'"'"(シングル-ダブル-シングル-ダブルクォート)をシングルクォートの前につける

> echo 'B'"'"'z'
B'z

理由はよくわからない。shellのquoteの処理を追うしかないんですかね。

上記の対応をすると以下のようなシェルスクリプトも動作する。

bashシェルスクリプト中のperlスクリプトでprint 'hello'のようなシングルクォートをつかう。

#!/bin/bash

perl -e '
	print '\''hello'\'';
	print "\n";
	print '"'"'hello2'"'"';
	print "\n";
'

また以下のようにすると

1 #!/bin/bash
2 
3 foo="Hello world"
4 
5 echo '$foo'
6 echo \'$foo\'

5行目は$foo、6行目は'Hello world'が表示される。

> ./hw.sh 
$foo
'Hello world'