#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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS