logo
Published on

Bashで多層シングルクォーテーションをエスケープする

Authors

Linuxパソコン・サーバーのコマンドライン、Bash言語で、シングルクウォートの中のシングルクウォートの中のシングルクウォートをエスケープする方法について紹介します。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_061b9794-98d7-4f99-b1d7-1ce0d08a7e9f.png

bashにおいてシングルクウォートのエスケープは以下。

'\''

じゃあ、更にこの'''で囲まれたコードのなかにシングルクウォートがある場合はどうやってエスケープすればよいのか?

'\''\'\'''\''

僕もこのようなコードを書いて、実際にシングルクウォートの中のシングルクウォートの中のシングルクウォートという状況を作り出すに至ったが、多層シングルクウォートのエスケープは予想以上に複雑であるようだ。

cd "${1}" && ls | xargs -I {} bash -c ' dirname="$( echo "{}" | awk '\''{print $10}'\'' )" ; [[ -d "${dirname}" ]] && [[ ! "${dirname}" =~ ^\.\.$ ]] && echo "{}" | awk -v dirname="${dirname}" '\''{ " du -h "dirname" | tail -1 | awk '\''\'\'''\''{ print $1 }'\''\'\'''\'' " |& getline $11 ; print $0 }'\''  ' ; cd - # great

さらに深層のシングルクウォートエスケープシーケンスを知りたい場合は以下のページと以下のスクリプトが役に立つだろう。

quotify(){

cat << 'EOT' > ${HOME}/quotify ; chmod 755 ${HOME}/quotify ; ${HOME}/quotify
#!/usr/bin/perl -pl
s/'/'\\''/g;
$_ = qq['$_'];
EOT

}
bash - How to escape single quotes within single quoted strings? - Stack Overflow