#author("2021-12-04T12:49:57+09:00","default:ryuichi","ryuichi")
#author("2021-12-04T12:50:09+09:00","default:ryuichi","ryuichi")
* 引用符のエスケープ [#g4c7166a]
** 問題 [#sf7e997b]
$ perl -e "print 'hello world'"
hello world
- 上のperlコマンドの引数になっている'''"print 'hello world'"'''のうち、ダブルクォートをシングルクォートにしたい
$ perl -e 'print 'hello world'' 🙁🔥🔥🔥
$ perl -e 'print 'hello world''
- 単純に'''ダブルクォート(")'''を'''シングルクォート(')'''に変えても動作しない
** 解法 [#vffed098]
(1) 'print 'hello world''
(2) 'print '\'hello world''
(3) 'print '\''hello world''
(4) 'print '\''hello world'\'
- (1) この ''' print 'hello world' ''' の部分を1つの文字列になるようにエスケープする。pの前の'によってシングルクォートが開いており、hの前の'で閉じている
- (2) クォートが閉じてる状態なので、hの前のシングルクォートは\'のようにエスケープしたシングルクォートを置く
- (3) 次に、'でシングルクォートを開く
- (4) dの後のシングルクォートで(3)のシングルクォートは閉じてる状態なので、\'でエスケープしたシングルクォートを置く
*** 参考 [#vd053e4e]
(1) bash -c "echo -n 'hello, ' && sleep 3 && echo -n 'World'"
(2) bash -c 'echo -n 'hello, ' && sleep 3 && echo -n 'World''
(3) bash -c 'echo -n '\''hello, '\'' && sleep 3 && echo -n '\''World'\'
- (1)のようなコマンドのダブルクォートを(2)のようにシングルクォートに変える場合は(3)のようになる
** $'...'を使った解法 [#fbcae2e6]
perl -e $'print \'hello world\''
- シングルクォート('...')でくくる代わりに$'...'でくくる
- くくった中のシングルクォート('hとd')は\'でエスケープする
** 参考 [#ebb27823]
https://unix.stackexchange.com/questions/30903/how-to-escape-quotes-in-shell